java中join的使用
2020/3/15 17:01:50
本文主要是介绍java中join的使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
java中join的使用
join()应该是我们在java中经常会用到的一个方法,它主要是将当前线程置为WAITTING状态,然后等待调用的线程执行完毕或被interrupted。
join()是Thread中定义的方法,我们看下他的定义:
/** * Waits for this thread to die. * * <p> An invocation of this method behaves in exactly the same * way as the invocation * * <blockquote> * {@linkplain #join(long) join}{@code (0)} * </blockquote> * * @throws InterruptedException * if any thread has interrupted the current thread. The * <i>interrupted status</i> of the current thread is * cleared when this exception is thrown. */ public final void join() throws InterruptedException { join(0); } 复制代码
我们看下join是怎么使用的,通常我们需要在线程A中调用线程B.join():
public class JoinThread implements Runnable{ public int processingCount = 0; JoinThread(int processingCount) { this.processingCount = processingCount; log.info("Thread Created"); } @Override public void run() { log.info("Thread " + Thread.currentThread().getName() + " started"); while (processingCount > 0) { try { Thread.sleep(1000); } catch (InterruptedException e) { log.info("Thread " + Thread.currentThread().getName() + " interrupted"); } processingCount--; } log.info("Thread " + Thread.currentThread().getName() + " exiting"); } @Test public void joinTest() throws InterruptedException { Thread t2 = new Thread(new JoinThread(1)); t2.start(); log.info("Invoking join"); t2.join(); log.info("Returned from join"); log.info("t2 status {}",t2.isAlive()); } } 复制代码
我们在主线程中调用了t2.join(),则主线程将会等待t2执行完毕,我们看下输出结果:
06:17:14.775 [main] INFO com.flydean.JoinThread - Thread Created 06:17:14.779 [main] INFO com.flydean.JoinThread - Invoking join 06:17:14.779 [Thread-0] INFO com.flydean.JoinThread - Thread Thread-0 started 06:17:15.783 [Thread-0] INFO com.flydean.JoinThread - Thread Thread-0 exiting 06:17:15.783 [main] INFO com.flydean.JoinThread - Returned from join 06:17:15.783 [main] INFO com.flydean.JoinThread - t2 status false 复制代码
当线程已经执行完毕或者还没开始执行的时候,join()将会立即返回:
Thread t1 = new SampleThread(0); t1.join(); //returns immediately 复制代码
join还有两个带时间参数的方法:
public final void join(long millis) throws InterruptedException 复制代码
public final void join(long millis,int nanos) throws InterruptedException 复制代码
如果在给定的时间内调用的线程没有返回,则主线程将会继续执行:
@Test public void testJoinTimeout() throws InterruptedException { Thread t3 = new Thread(new JoinThread(10)); t3.start(); t3.join(1000); log.info("t3 status {}", t3.isAlive()); } 复制代码
上面的例子将会输出:
06:30:58.159 [main] INFO com.flydean.JoinThread - Thread Created 06:30:58.163 [Thread-0] INFO com.flydean.JoinThread - Thread Thread-0 started 06:30:59.172 [main] INFO com.flydean.JoinThread - t3 status true 复制代码
Join()还有个happen-before的特性,这就是如果thread t1调用 t2.join(), 那么当t2返回时,所有t2的变动都会t1可见。
之前我们讲volatile关键词的时候也提到了这个happen-before规则。 我们看下例子:
@Test public void testHappenBefore() throws InterruptedException { JoinThread t4 = new JoinThread(10); t4.start(); // not guaranteed to stop even if t4 finishes. do { log.info("inside the loop"); Thread.sleep(1000); } while ( t4.processingCount > 0); } 复制代码
我们运行下,可以看到while循环一直在进行中,即使t4中的变量已经变成了0。
所以如果我们需要在这种情况下使用的话,我们需要用到join(),或者其他的同步机制。
本文的例子可以参考github.com/ddean2009/l…
更多教程请参考 flydean的博客
这篇关于java中join的使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南