0

whileのようなコストのかかるループなしで、誰でも無期限に実行されるスレッドを作成するにはどうすればよいですか?

私はこのようなものを望んでいないように

public void run() {

            while(true)
            {
                do Blah Blah Blah
                Thread.sleep(.....);

            }

        }

このような長時間実行されるスレッドを作成するための最適化された方法。

前もって感謝します。

4

3 に答える 3

6

while (true) { ... }単純な無限ループを実装する最もクリーンな方法であることがわかりました。これ以上コンパクトで費用対効果の高い方法はないと思います。

好む人もfor (;;) { ... }いますが、私はそれがぎこちなく見えると思います。

コストに関しては、javac両方を次のようにコンパイルします

public static void main(java.lang.String[]);
  Code:
   0:  ...
       ...
       ...
       goto 0

}

ループを無限にしたいのであれば、これ以上効率的な方法はありません。


コードにがあるのでThread.sleep、たとえばjava.util.Timerとを調べることもお勧めしますjava.util.TimerTask


ループが何かを繰り返し実行しようとする場合、長い目で見ればおそらく CPU 時間を浪費していることは間違いありません。特に、このタイプのスレッドのインスタンスが多数ある場合。この場合、 observer patternを調べることをお勧めします。オブジェクトに何かを待ってもらい、オブジェクトが試みていることに成功する可能性に影響を与えるオブジェクトに耳を傾けます。

于 2012-05-18T06:05:51.150 に答える
1

どのような点でwhile(true)「コストがかかる」と考えますか? これがパフォーマンスに影響を与えているという証拠はありますか? それよりも安いと思う手術は何ですか?

あなたのコメントから注意してください:

このような無限のwhileループがCPUをブロックしていると思います。そうじゃない?だからコストがかかると思います。

一部ではなく、ループ全体を検討しているようです。それでは、ループwhileで何をしているのか見てみましょう

do Blah Blah Blah
Thread.sleep(.....);

スレッドにスリープを明示的に指示しています。スリープ中は、CPU リソースを消費しません。いいえ、それは高価ではありません。確かに、睡眠時間が非常に短く、「何とか何とかしよう」が非常に速い場合は、非常に多くのループが発生しますが、その場合は睡眠時間を増やすことを検討する必要があります. (また、スレッドを中断せずに、スレッドがスリープ状態であっても、正常に終了することをスレッドに通知できる他のアプローチも検討する必要があります。)

あなたが実際に達成しようとしていることについての情報は何も提供していませんが、基本的に の使用はwhileここでは問題ではありません。ループする頻度と、それが本当に単純な時間ベースの値かどうかを考えてみてください。たとえば、このスレッドが作業を処理することを意図している場合、何らかの説明のプロデューサー/コンシューマー キューが必要になる可能性があります。実行する作業がある間、スレッドをスリープ状態にする必要はありませんが、それまでウェイクアップする必要はありませんやるべき仕事があります。もちろん、これは一例にすぎません。これ以上の情報がなければ、これ以上のアドバイスはできません。

于 2012-05-18T06:11:23.653 に答える
1

あなたがコストとして定義したものを推測しているので、考えられる可能なコストをお知らせしたいと思います.

スレッドには通常、それに関連付けられたスタック メモリがいくつかあります。デスクトップ/ユーザー アプリケーションなど、多くのアプリケーションのスレッドに関連付けられているスタック メモリの量は、実際には問題になりません。しかし、多数のユーザーのそれぞれからの長期的な接続を処理する必要があるサーバーを開発しているとします。そして、接続されているすべてのユーザーに対して、サーバーは同じタスクを繰り返し実行する必要があるとしましょう (while ループで行っていることのように)。接続/ユーザーごとにスレッドを使用してこのソリューションに対処すると、非常にコストがかかる可能性があります。そのため、スレッドでブロック/スリープする代わりに、イベントを取得するたびに ThreadPool からスレッドに同じタスクを実行するように依頼する方が効率的であることがよくあります。これにより、メモリ使用量が大幅に改善されます。

「無期限」とおっしゃっていたので、おそらくそうではありませんが、最近出くわした興味深い問題だったので、それについて説明しようと思いました。

于 2012-05-18T06:37:07.697 に答える