我想检查某个线程是否已经加入 在下面的代码中,我有不同时间完成的线程,我想检查线程是否已终止但尚未加入。
有没有一种好方法可以检查这个?
while(!allJoined){
allJoined=true;
for ( int i = 0; i < 10; i++ )
{
try {
if(!threadList[i].isAlive() && threadList[i].NOT_YET_JOINED() ) {
threadList[i].join(0);
System.out.println("Joined t-"+i);
} else {
allJoined = false;
}
} catch (Exception e) {
System.out.println("MASTER: Child interrupted."+e);
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
System.out.println("Child interrupted.");
}
}
答案 0 :(得分:2)
您是否有join()
个线程是您的状态的一部分,而不是线程的状态。想象一下:你可以让几个线程都尝试加入给定的工作线程。
为什么不保留已加入的主题列表?
然后在join
之前检查该列表。
Vector<Thread> joined = new Vector<Thread>();
for(int i=0;i<threadList.length;i++) {
if(threadList[i].isAlive() && !joined.contains(threadList[i])){
threadList[i].join(0);
joined.add(threadList[i]);
}
}
然后使用joined.size()查看是否所有人都加入了。
答案 1 :(得分:1)
如果要简化此模式,请使用ExecutorService
e.g。
ExecutorService es = Executors.newFixedThreadPool(nThread);
for(int i=0;i< nTasks; i++)
es.executor(new Runnable .... );
es.shutdown();
es.awaitTermination(timeoutSeconds, TimeUnit.SECONDS);
这将创建一个小于任务数的线程池,并等待它有效地完成。
答案 2 :(得分:0)
让Runnable
个对象也展开Observable
。让您的主类实现Observer
并在启动时注册它们。
在线程从run()
方法返回之前,让它们通知。这样你就可以在他们准备就绪时加入,你知道你加入了哪些。 (你当然要跟踪哪些仍在运行以及你加入了哪些)
答案 3 :(得分:0)
Thread.getState()==TERMINATED