当没有更多线程处于活动状态时,如何突破循环

时间:2013-12-05 06:15:01

标签: java multithreading

我有一个程序,我初始化并启动可变数量的线程。我需要主程序与线程交互,所以我把它们放在一个无限循环中。在所有线程都已经死亡之后我想要一种打破循环的方法。这是我的代码的一部分:

public static void main(String[] args) {
//some random initializing

for(int i = 1; i <= num; i++){     //p1 is a Runnable
        Thread t = new Thread(p1, "t"+ Integer.toString(i));
        t.start();
} 
while(true){
//do some stuff while threads are active
//not sure what if statement to put here to break loop
}

如果需要,我可以发布更多我的代码,但我认为这在很大程度上是不相关的。

3 个答案:

答案 0 :(得分:3)

你可以在这里使用CountDownLatch(因为java 1.5),tt是一个同步辅助工具,允许一个或多个线程等到其他线程中执行的一组操作完成。

段:

CountDownLatch signal = new CountDownLatch(num);
...
for(int i = 1; i <= num; i++){     //p1 is a Runnable
        Thread t = new Thread(p1, "t"+ Integer.toString(i),signal);
        t.start();
} 
signal.await();           // wait for all to finish

...在线程的run()方法中......

public void run(){
       ...                // do stuff
       signal.countDown(); // sending signal that work has done.
}

答案 1 :(得分:1)

而不是使用while循环停止,只需join所有线程。 join方法基本上只是等待线程完成。

Thread[] threads = new Thread[num];
for(int i = 1; i <= num; i++){
    Thread t = new Thread(p1, "t"+ Integer.toString(i));
    threads[i] = t;
    t.start();
} 

for(int i = 1; i <= num; i++){
    threads[i].join();
}

有关详细信息,请参阅docs

答案 2 :(得分:1)

我会创建一个Threads数组,稍后检查它们是否完成,然后通过相同的for循环,但也设置threads数组中的值。最后,在while循环中,我将检查是否所有线程都没有使用线程的状态方法完成 - How to check if thread is terminated?

Thread[] threads = new Thread[num];

for(int i = 1; i <= num; i++){     //p1 is a runnable.
        Thread t = new Thread(p1, "t"+ Integer.toString(i));
        threads[i-1] = t;
        t.start();
} 

while(!allThreadsCompleted(threads)) {
 // do some of your code here
}

public static boolean allThreadsCompleted(Thread[] threads) {
    for(int i = 0; i < threads.length; i++) {
        if(threads[i].getState()!=Thread.State.TERMINATED)
            return false;
    }
    return true;
}

我现在意识到,如果你真的想在while循环中做一些事情,这将是有用的,而不仅仅是为了拖延目的。希望这会有所帮助。