0

実行するものが 10 個あるとしますが、一度に実行できるスレッドは 3 つだけです。

ArrayList<NewThread> threads = new ArrayList<NewThread>();

for(int i = 1; i < args.length; i++) {
   NewThread t = new NewThread(args[i]);
   threads.add(newThread);

   if( (i%3) == 0) {
      for (NewThread nt : threads) {
         nt.join();
      }
      threads.clear();
   }
}

クラス NewThreads は Runnable を実装します。join() メソッドは、スレッドが終了するのを待ってから再びループしてスレッドの次のバッチを開始するように機能すると思っていましたが、代わりにスタック オーバーフロー例外が発生しました。join() を間違って実装していると思いますが、その方法がわかりません。私は現在それをやっています

public void join() {
   this.join();
}

私のNewThreadクラスで。これを機能させる方法、またはより良い方法について何か提案はありますか?

4

2 に答える 2

5

あなたは無限に自分自身を呼び出すために join を実装またはオーバーライドしています

public void join() {
   this.join(); // call myself until I blow up.
}

最も簡単な解決策は、既存の Thread.join() を使用することですが、より良い解決策は固定サイズのスレッド プールを使用することです。これにより、多くの時間とコードを浪費する可能性のあるスレッドを開始および停止する必要がなくなります。

ExecutorService を使用できます

ExecutorService es = Executors.newFixedThreadPool(3);
for(int i=0;i<10;i++)
    es.submit(new Task(i));
于 2013-04-24T20:24:48.047 に答える