Java如何判断线程是否结束的三种方法

网友投稿 352 2022-08-20


Java如何判断线程是否结束的三种方法

目录方法1方法2方法3

方法1

通过Thread类中的isAlive()方法判断线程是否处于活动状态。

线程启动后,只要没有运行完毕,都会返回true。

【注】如果只是要等其他线程运行结束之后再继续操作,可以执行t.join(),即:在t执行完毕前挂起。

方法2

通过Thread.activeCount()方法判断当前线程的线程组中活动线程的数目,为1时其他线程运行完毕。

方法3

通过java.util.concurrent.Executors中的方法创建一个线程池,用这个线程池来启动线程。启动所有要启动的线程后,执行线程池的shutdown()方法,即在所有线程执行完毕后关闭线程池。然后通过线程池的isTerminated()方法,判断线程池是否已经关闭。线程池成功关闭,就意味着所有线程已经运行完毕了。

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class Test {

public static void main(String args[]) throws InterruptedException {

ExecutorService exe = Ehttp://xecutors.newFixedThreadPool(50);

for (int i = 1; i <= 5; i++) {

exe.execute(new SubThread(i));

}

exe.shutdown();

while (true) {

if (exe.isTerminated()) {

System.out.println("结束了!");

break;

}

Thread.sleep(200);

}

}

}

判断线程池中的线程是否全部执行完毕的另外一种解决方案则是使用闭锁(CountDowhttp://nLatch)来实现,CountDownLatch是一种灵活的闭锁实现,它可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器,该计数器被初始化为一个正数,表示需要等待的事件数量。countDown方法递减计数器,表示有一个事件已经发生了,而await方法等待计数器达到零,即表示需要等待的事情都已经发生。可以使用闭锁来这样设计程序达到目的:

public class CountDownLatchApproach {undefined

public static void main(String[] args) throws IOException, InterruptedException {undefined

final int nThreads = 10;

final CountDownLatch endGate = new CountDownLatch(nThreads);

final File stream = new File("c:\\temp\\stonefeng\\stream.txt");

final OutputStream os = new FileOutputStream(stream);

final OutputStreamWriter writer = new OutputStreamWriter(os);

ExecutorService exec = Executors.newCachedThreadPool();

for (int i = 0; i < nThreads; i++) {undefined

final int num = i;

Runnable task = new Runnable() {undefined

@Override

public void run() {undefined

try {undefined

writer.write(String.valueOf(num)+"\n");

} catch (IOException e) {undefined

e.printStackTrace();

} finally {undefined

endGate.countDown();

}

}

};

exec.submit(task);

}

endGate.await();

writer.write("---END---\n");

writer.close();

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringCloud通过Feign传递List类型参数方式
下一篇:Java中Map实现线程安全的3种方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~