如何在Java中启动更多内容之前等待线程完成

时间:2013-04-24 20:22:35

标签: java multithreading

所以说我要运行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类中。关于如何使这项工作或更好的方式去做的任何建议?

2 个答案:

答案 0 :(得分:5)

你是实现者或重写联接,无休止地召唤自己

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));

答案 1 :(得分:2)

这只是一个简单的错误。

删除方法

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

此方法一次又一次地调用自身。 NewThread应该扩展Thread。

或第二种方式:

保留方法并致电

     Thread.currentThread.join();

其余的看起来很好。