同時に(ループ内で)複数の呼び出し可能なスレッドを開始し、メインスレッドの全員からいくつかの情報を返したいと考えています。これを実現する方法は?
4 に答える
私たちはユースケースについて何も知らないので、あなたの質問から最善のアプローチを言うことは不可能です! しかし、一般的に言えば、 を使用してスレッド プールを作成し、Executors.newFixedThreadPool()
ジェネリックCallable<T>
オブジェクトをスレッド プールに送信することができFuture<T>
ます。.
get()
メイン スレッドでは、Future をループして、対応する callable がスレッド プールで実行を終了するまでブロックする各メソッドを呼び出すことができます。
メインスレッドでスレッドを作成するとき、それらへの参照を保持し、これらの参照を通じてデータを取得できます。擬似コードは次のようになります。
int nSize = <some nomber>;
MyThread myThreadArray[] = new MyThread[nSize];
for(int i = 0; i < nSize; i++) {
myThreadArray[i] = new MyThread();
// Init and start the thread.
}
// Wait for all thread to end.
for(int i = 0; i < nSize; i++) {
myThreadArray[i].getData();
}
固定サイズの配列の代わりに、任意の型をList
使用できます。
編集/追加:
子スレッドにデータを保持する代わりに、メイン スレッドにデータを割り当て、子スレッドの作成時に参照を与えることもできます。
int nSize = <some nomber>;
MyThreadData myThreadDataArray[] = new MyThreadData[nSize];
for(int i = 0; i < nSize; i++) {
Thread thread = new MyThread(myThreadDataArray[i]);
// Init and start the thread.
}
// Wait for all thread to end.
for(int i = 0; i < nSize; i++) {
// Do something with myThreadDataArray[i].
}
Thread
これにより、スレッドの終了後にスレッドデータを長時間処理する必要がある場合に、gc がオブジェクトをより早く再利用できるようになります。
私の理解では、Java のスレッドの開始と停止の優先順位は保証されていません。一部のスレッドは、おそらく I/O を待機しているために、別のスレッドに道を譲るために開始された後、待機モードになる場合があります。
ループを使用して同時にスレッドを開始する - あなたが望むものがあるかもしれないいくつかの質問があります。
スレッド 10000 回の start() 呼び出しが 10000 回の run() 呼び出しよりも時間がかかるのはなぜですか?
私はあなたの要件が何であるかわかりません.しかし、私はあなたに小さな道を与えることができます. スレッドごとに一意のIDを生成し、そのIDをnull値フィールドとともに(データベース)どこかに置くことができます。生成されたスレッドを作成して、それらが属するテーブル(ID)を更新します。その後、値が更新されたかどうかを確認できます値を取得します。