終了しないJavaスレッドを作成するにはどうすればよいのでしょうか。終了しないスレッドを作成する
ExecutorService pool = Executors.newFixedThreadPool(3);
for (int i = 0; i < numThreads; ++i) {
pool.submit(new Task());
}
pool.shutdown();
とタスクは私のアプローチと私が持っている2つの懸念があり、この
public class Task {
...
public void run() {
while(true) { }
}
}
のようなものになります:
-
を 現在、私は基本的には基本的にのように見える「ランナー」を持っています
仕事をした後に戻ってくるタスクを作成し、最小限の作業を行うスレッドを作成し続ける必要がありますか?オーバーヘッドについては心配していますが、測定方法はわかりません。
スレッドが無限にループしている場合、強制的に実行可能ファイルを終了すると、それらのスレッドはシャットダウンされ、クリーンアップされますか?いくつかのテストの後で、ExecutorServiceを含むコードが強制的にシャットダウンされると、InterruptExceptionがスローされているようには見えません。
EDIT: は手の込んだには、タスクは、私はキューが、ここで使用するキーでブロックし、@Dレバントに同意
public void run() {
while(true) {
// Let queue be a synchronized, global queue
if (queue has an element) {
// Pop from queue and do a very minimal amount of work on it
// Involves a small amount of network IO (maybe 10-100 ms)
} else {
sleep(2000);
}
}
}
両方の質問は、実際には 'while(true){}'ブロックの内容に依存します。それは回転している、眠っている、I/Oをブロックしている、または何ですか? – erickson
スレッドプールを作成することは無意味ですが、スレッドごとにforever-loopを実行するだけです。あなたが何をしようとしているのか、それはもっと良いアイデアかもしれません:キューから読むために1つの専用のスレッドを持っている。それが要素を取得すると、その要素を短い実行 'Task'を作成して処理し、スレッドプールで実行します。 –
Hey @erickson:編集を追加しました。基本的には、スリープ状態になるか、ネットワークIOでブロックされます(計算は最小限に抑えられます)。 – Lycus