join()方法
来源:互联网 发布:河北省中标数据网 编辑:程序博客网 时间:2024/05/21 18:00
title:join方法
date:2017年11月11日23:28:13
今天来简单看一下join()方法,
join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。
直接上代码:
package com.wangcc.MyJavaSE.thread.join;public class JoinTest { public static void main(String []args) throws InterruptedException { Thread t1=new Thread(new Runnable() { public void run() { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName()+"start"); try { Thread.sleep(2000); } catch (Exception e) { // TODO: handle exception } System.out.println(Thread.currentThread().getName()+"finish"); } },"t1"); t1.start(); t1.join(); System.out.println("main ....."); }}
输出:
t1startt1finishmain .....
我们看到主线程 在执行了t1.join()之后就把cpu让给了t1,直到t1结束,主线程才继续获得CPU执行下去。
那这是怎么做到的呢?这时我们就得看看join()方法到底做了什么。
public final void join() throws InterruptedException { join(0); } public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }
我们主要看这几行
if (millis == 0) { while (isAlive()) { wait(0); }
当t1还活着的时候,就一直调用wait(0)阻塞线程。那这里到底阻塞的是t1还是Main Thread呢?显然从结果上看是阻塞Main Thread。但是我们不是调用的t1.wait()吗,为什么不是阻塞t1呢?这里其实你只要明白wait()的真正作用就可以了,我们知道wait()是Object类的方法,它阻塞的线程是当前持有该对象的线程。这里是调用t1.wait(),也就是阻塞了持有t1对象的线程。那么持有t1对象的线程在这里自然是Main Thread。
我们分析下代码:
首先,在主线程里创建了t1对象实例,主线程持有了t1,然后在主线程里执行t1.start();执行了t1.start()之后,t1线程处于就绪态,此时t1和Main Thread两个线程在争夺CPU资源,然后在某一时刻CPU资源重新回到了主线程之后,就会继续执行代码t1.join();注意了,是主线程执行的这行代码,所以此时就阻塞了主线程这个持有t1的线程,直到t1执行完成之后,退出循环,不再阻塞,线程重新转入就绪状态,此时只有主线程一个线程,获得CPU,从就绪态转入运行状态,继续执行主线程,就得到了上面的输出结果。
- join方法
- join方法
- join()方法
- join()方法
- join()方法
- join()方法
- join方法
- JScript方法-join方法
- 连接线程Join()方法
- 关于Thread.join( )方法
- 扩展方法join试演
- 线程的join方法
- 数据库 Join 方法
- JavaScript join() 方法
- Java Thread Join方法
- 线程的join方法
- Javascript join()方法
- JOIN方法说明
- appium自动化参考博客
- 实施定量风险分析的工具 EMV分析与决策树学习
- uva10655(矩阵快速幂)
- CentOS Linux 6.8 tomcat的启动关闭
- 对于json的理解
- join()方法
- Java 算法练习 ——— CodeWar Day 1
- 购物车逻辑
- 打印九九乘法表
- 《算法4》图&深度优先与广度优先算法
- CCF-201709-2-公共钥匙盒
- CCPC.2017哈尔滨站-重现赛-B(二分)
- STM32开发环境搭建
- 软件工程(C编码实践篇)学习总结