2013-04-24 39 views
0

因此,假设我有10件事情要运行,但我一次只能运行3个线程。如何在Java中启动更多之前等待一个线程完成

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类。有关如何使这项工作或更好的方式去做的任何建议?

+0

如何使用线程池和SingleThreadExecutor? http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html – 2013-04-24 20:23:56

+0

那么,这只是一个简单的错误:删除整个连接方法: – xtraclass 2013-04-24 20:28:08

+0

如果你还没有开始一个线程,你可能不会想等待它加入。 't.start()'然后't.join()'。 – StoneBird 2013-04-24 20:28:14

回答

2

这只是一个简单的错误。

取出方法

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

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

或第二道:

保持方法,并调用

 Thread.currentThread.join(); 

其余的看起来不错。

+1

谢谢,这工作完美,很简单。 – Nuez 2013-04-24 20:36:42

5

您是implementins或压倒一切的加盟自称不休

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)); 
相关问题