检查java Thread是否已加入join()

时间:2011-09-20 23:52:28

标签: java multithreading

我想检查某个线程是否已经加入 在下面的代码中,我有不同时间完成的线程,我想检查线程是否已终止但尚未加入。

有没有一种好方法可以检查这个?

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."); 
        } 
    }

4 个答案:

答案 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