2011-01-20 8 views
1

JavaスレッドをRunnable状態にするのにCPUを集中させるのではない方法がありますか?Javaスレッドの拡張runnable状態

編集:私はバグを再現しようとしています。私はデータベース接続が一定期間後にリセットされていると思っていますが、スレッドスリープはそれをしませんでした。私が他の根本的な原因に移る前に、実行可能状態のスレッドも接続をリセットしないようにしたいと思っています。

EDIT:大きなハックのような回避策が見つかりました。それが他の人に何かを助けるのであれば、自分の質問に回答を投稿してください。

+1

Thread.sleep()で何が問題になっていますか? –

+1

@Sergeyスレッドがスリープしているときのスレッドの状態を確認しましたか? –

+1

あなたがそれで達成しようとしていることを教えてくれたら、私たちは代替ソリューションを指摘することができます。 – meriton

答えて

2

実行可能状態のスレッドは Java仮想マシンで実行されるが、それは、プロセッサなどのオペレーティングシステム から他のリソースを待機してもよいです。

は、私はそうは思わない他の何か:)

+0

あなたのヒントが助けになりました! – Russell

+0

その後、答えを受け入れます。 – adrianboimvaser

2

上のプロセッサの仕事を持っています。スレッドが実行可能な状態に留まる唯一の方法は、CPUバウンドにするか、CPUバウンドだったより優先度の高いスレッドを待つことです。

+0

彼の最高の賭けは、while(真)のスレッドになります。産出(); –

0

スレッドが実行可能な場合(OSレベルでは、一般に "実行可能"と "実際にCPUで実行中"の違いがあります)、ある時点で遅かれ早かれOSはそれはいくらかのCPU時間です。実際には「実行可能」というカテゴリはありませんが、実際にはCPU時間を与えていません。潜在的なオプションは、スレッドに低い優先度を与えることです:あなたの特定のシステムで実際に何を意味するのかを明確にしてください(私は少し書いたthread prioritiesと、それらが本当に役立つ場合は別のOSで何を意味するのか)。

また、Thread.yield()もご覧ください。別のOS上では異なることを意味しています。

しかし、私は上記のコメントからストレスを感じています。あなたのOSが、開いている特定の時間の後、および/またはスレッドの状態に依存しているのではなく、 CPU使用率。

+0

私がスレッド状態だと思う唯一のことは、スレッドをスリープ状態(アイドル状態の接続)にすると接続がリセットされないということです。結局のところ関連性のないものかもしれません。あなたのご意見ありがとうございます。 – Russell

1

私はちょうど今、回避策が見つかったと思います。

存在しないドメインに接続しようとすると、スレッドは接続がタイムアウトするまで実行状態になります(これはOSによって異なると思います)。

try { 
    new URL("http://thisdomaindoesnotexist.com"). 
    openConnection(). 
    getInputStream(). 
    read(); 
} 
catch (Exception e) {} 

私のマシンでは約20秒かかります。

System.in InputStreamも動作しますが、Webアプリケーションにはコンソール入力がありません。

関連する問題