join方法的作用

thread.join()方法用于把指定的线程加入到当前线程中,把当前线程的CPU执行时间让给另一个线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

threadA.join();      //把当前线程执行时间让给threadA线程,直到threadA执行完毕才会继续执行当前线程
threadA.join(1000);  //把当前线程执行时间让给threadA线程,1000毫秒后,A、B两个线程再重新竞争

join方法的源码如下,可以看出是通过while和wait的方式进行控制:

/**
* Waits at most <code>millis</code> milliseconds for this thread to
* die. A timeout of <code>0</code> means to wait forever.
*/
//此处A timeout of 0 means to wait forever 字面意思是永远等待,其实是等到t结束后。
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;
}
}
}

下面这个程序的输出结果是多少?A:0    B:1000    C:1   D:不确定

public class ThreadTest extends Thread {

    public static int a = 0;

    public void run() {
for (int k = 0; k < 100000; k++) {
a = a + 1;
}
} public static void main(String[] args) throws Exception {
Thread t = new ThreadTest();
t.start();
t.join(1);
System.out.println(a);
}
}

答案是:D。因为t.start()只是让线程进入了RUNNABLE状态,但并不一定在1毫秒内执行到t线程的run方法。如果没有走进t线程的run方法,直接执行了主线程的打印语句,则输出结果为0;如果进入了t线程的run方法,并且在1毫秒内将t线程的run方法执行完毕,则输出结果为100000;否则,可能是0~100000之间的任意数字。因此最终答案不能确定

最新文章

  1. 面筋BD
  2. ChannelPipeline
  3. Atitit.mvc的趋势与未来attilax总结
  4. 观察器observes与对象初始化
  5. 用了skin皮肤控件之后,报错:容量超出了最大容量 参数名:capacity
  6. Matlab求极限
  7. camstar --飞达上料
  8. 博客系统typecho的安装与使用
  9. php 定时任务
  10. CentOS下安装yum源的流程和操作
  11. tomcat 监控脚本
  12. 位运算练习:将整数A转换为B,需要改变多少个bit位
  13. lower_bound函数与upper_bound函数
  14. HTC Vive 基础入门 基于Unreal Engine 4引擎
  15. 再谈树形dp
  16. Git在eclipse中的使用,克隆导入eclipse项目
  17. Java之旅_面向对象_重写和重载
  18. 【刷题】LOJ 6004 「网络流 24 题」圆桌聚餐
  19. android防止按钮连续点击方案之AOP
  20. 转的:burp suite小例子

热门文章

  1. 如何在 Google 地图中添加标记和说明
  2. NodeList对象的特点
  3. delphi将字符串转换成stringlist
  4. UVA 796 Critical Links —— (求割边(桥))
  5. HTML语义化是什么?为什么要语义化?
  6. ARP输入 之 arp_rcv
  7. QT Embedded二三事之QObject的元对象
  8. yum 保存下载的rpm 包
  9. Android8.0新特性总结
  10. [go]mysql使用