我有一个程序,我初始化并启动可变数量的线程。我需要主程序与线程交互,所以我把它们放在一个无限循环中。在所有线程都已经死亡之后我想要一种打破循环的方法。这是我的代码的一部分:
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
}
如果需要,我可以发布更多我的代码,但我认为这在很大程度上是不相关的。
答案 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循环中做一些事情,这将是有用的,而不仅仅是为了拖延目的。希望这会有所帮助。