2

一連のスレッド オブジェクトを配列リストに格納しています。これらのスレッドをランダムに開始できるようにしたい。同じスレッドを複数回開始できます。スレッド オブジェクトを開始する前に、スレッドが生きているかどうか、およびスレッドの状態が NEW または TERMINATED のいずれかであるかどうかを確認します。この制限は、「ビジー」スレッドを妨害したくないためです。現在、新しいスレッドの場合、これは正常に機能します。しかし、TERMINATED スレッドの場合、例外が発生します。

スレッドが終了したら、「新しい」スレッドに戻るべきではありませんか? または、スレッドは「使い捨て」ですか?一度使用して完了しますか?

4

5 に答える 5

2

Thread.start()のドキュメントで述べられているように、「スレッドを複数回開始することは決して合法ではありません。特に、実行が完了すると、スレッドを再開することはできません。」

Runnableインスタンスを保持し、それぞれの実行がいつ終了するかを追跡するための独自のロジックを実装することをお勧めします。Runnables を実行する最も簡単な方法は、おそらくExecutorを使用することです。

于 2011-03-23T21:00:03.927 に答える
1

で提供されている素晴らしいものを使用しているはずですjava.util.concurrent。あなたの説明に基づいて、ThreadPoolExecutorチェックアウトするのは良いことのように思えます.

于 2011-03-23T20:58:36.067 に答える
1

これが私がやった方法です

class GarbageDisposalThread extends Thread {
public void start() {
   try {
      super.start();
   } catch( IllegalThreadStateException e ) {
      this.arrayList.remove(this);
      this.arrayList.add( new GarbageDisposalThread( this.arrayList ));
   }
}
private GarbageDisposalThread() {
}
public GarbageDisposalThread( ArrayList<Whatever> arrayList ) {
   this.arrayList = arrayList;
   this.start();
}
public void run() {
   // whatever the code
}
private ArrayList<Whatever> arrayList = null;
}

それでおしまい!必要に応じてコードを変更できます:P

于 2012-06-07T14:54:48.170 に答える
0

別の投稿から...

ThreadPoolExecutor を使用すると、タスクを渡し、サービスがタスクにスレッドを割り当てられるようになります。タスクが終了すると、スレッドは次のタスクを取得するまでアイドル状態になります。

したがって、スレッドを再起動しませんが、タスクをやり直し/再開します。

于 2011-03-23T23:15:21.787 に答える
0

Java スレッドは再開できません。

javadoc から:

スレッドを複数回開始することは決して合法ではありません。特に、実行が完了すると、スレッドは再開されない場合があります。

詳細については、Thread.start() javadoc を参照してください。

あなたがやろうとしていることを達成する他の方法があります。たとえば、実行を終了したスレッドで行われた作業を継続する新しいスレッドを使用できます。また、 java.util.concurrent パッケージを調査することもできます。

于 2011-03-23T20:59:14.507 に答える