2013-04-24 36 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)); 
相關問題