博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[java] java 线程join方法详解
阅读量:6295 次
发布时间:2019-06-22

本文共 2639 字,大约阅读时间需要 8 分钟。

 

join方法的作用是使所属线程对象正常执行run方法,而对当前线程无限期阻塞,直到所属线程销毁后再执行当前线程的逻辑。 一、先看普通的无join方法 NoJoin.java
public class NoJoin  extends  Thread{    @Override    public void run() {        try {            long count = (long)(Math.random()*100);            System.out.println(count);            Thread.sleep(count);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
public class NoJoinTest {    public static  void main(String[] args){        NoJoin noJoin = new NoJoin();        noJoin.start();        System.out.println("执行到main....");    }}

输出:

现在要先输出时间,再执行main方法。

只需要添加join方法即可。

/** * Created by Administrator on 2016/1/5 0005. * * join方法的作用是使所属线程对象正常执行run方法,而对当前线程无限期阻塞,直到所属线程销毁后再执行当前线程的逻辑。 */public class JoinTest {    public static  void main(String[] args){        try {            NoJoin noJoin = new NoJoin();            noJoin.start();            noJoin.join();//join            System.out.println("执行到main....");        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

 

查看join源代码:

/**     * Waits at most {
@code millis} milliseconds for this thread to * die. A timeout of {
@code 0} means to wait forever. * *

This implementation uses a loop of {

@code this.wait} calls * conditioned on {
@code this.isAlive}. As a thread terminates the * {
@code this.notifyAll} method is invoked. It is recommended that * applications not use {
@code wait}, {
@code notify}, or * {
@code notifyAll} on {
@code Thread} instances. * * @param millis * the time to wait in milliseconds * * @throws IllegalArgumentException * if the value of {
@code millis} is negative * * @throws InterruptedException * if any thread has interrupted the current thread. The * interrupted status of the current thread is * cleared when this exception is thrown. */ 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; } } }

可见,join内部是对象的wait方法,当执行wait(mils)方法时,一定时间会自动释放对象锁。

 

转载地址:http://qtpta.baihongyu.com/

你可能感兴趣的文章
esxi所连交换机划vlan导致vm不能通讯
查看>>
关于CE端口线路整改的建议
查看>>
如何禁止使用本地administrator进行共享连接
查看>>
用python解析html[SGMLParser]
查看>>
hive执行流程(3)-Driver类分析1Driver类整体流程
查看>>
Android开发学习笔记:对话框浅析
查看>>
Ajax学习-Ajax简介
查看>>
下载备忘:甘特图实现的代码
查看>>
Linux文本比较命令:diff
查看>>
redux-form的学习笔记二--实现表单的同步验证
查看>>
小评 XenServer 6.0功能
查看>>
Android中获取屏幕的宽和高
查看>>
ACL访问控制列表
查看>>
Lync Server 2010迁移至Lync Server 2013故障排错Part1:缺少McsStandalone.msi
查看>>
域控制器建立教程
查看>>
RHCE 学习笔记(20) ACL
查看>>
Django 和 Ajax 简介
查看>>
Qt的一个颜色选取按钮QColorButton
查看>>
perl 散列数组
查看>>
puppet之service管理
查看>>