java线程join方法

java线程join方法java线程join方法1.join方法​ join方法的作用是进行线程插队,也就是说调用了join方法的线程相对于调用它的上级线程拥有跟高的执行权。调用join方法的线程的上级线程必须等待调用join方法的线程执行完成才能继续执行。举个小例子:publicclasstestjoin{ publicstaticvoidmain(String[]args)throwsI…

大家好,又见面了,我是你们的朋友全栈君。

java线程join方法

1.join方法

​ join方法的作用是进行线程插队,也就是说调用了join方法的线程相对于调用它的上级线程拥有跟高的执行权。调用join方法的线程的上级线程必须等待调用join方法的线程执行完成才能继续执行。

举个小例子:

public class testjoin{

	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		Thread t1 = new Thread(new t1(),"t1");
		t1.start();
		
		
	
	}			

}

class t1 implements Runnable {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName()+"->"+i);
			if(i==3) {
				Thread t2 = new Thread(new t2(),"t2");
				t2.start();
				try {
					t2.join();    //调用join方法,线程t1必须等待t2执行完毕才能继续执行。  
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
	}
}

class t2 implements Runnable {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 10; i++) 
			System.out.println(Thread.currentThread().getName()+"->"+i);
			
		
		
	}
}

运行结果如下:

t1->0
t1->1
t1->2
t1->3
t2->0
t2->1
t2->2
t2->3
t2->4
t2->5
t2->6
t2->7
t2->8
t2->9
t1->4
t1->5
t1->6
t1->7
t1->8
t1->9

​ 无论运行多少次,运行结果都不变,原因是t2线程运行了join方法,那么它的上级线程t1就必须等待t2运行完后才能继续调用。

2.join源码

join方法能传入一个常数,millis是要主线程暂停时间。

1.如果millis<0就抛出异常。

2.如果millis=0就判断当前调用join方法的线程是否存活。如果存活就不停地调用wait(0)方法。在一个实例Java对象上调用wait方法,那么当前线程就会从执行状态转变成等待状态,同时释放在实例对象上的锁,直到其它线程在刚才那个实例对象上调用notify方法并且释放实例对象上的锁,那么刚才那个当前线程才会再次获取实例对象锁并且继续执行。wait的作用是让“当前线程”等待,而这里的“当前线程”是指当前运行的线程。虽然是调用子线程的wait()方法,但是它是通过“主线程”去调用的;所以,休眠的是主线程,而不是“子线程”!

3.如果millis>0,先判断线程是否存活,然后调用wait方法。然后根据millis – now来调用wait方法,因为当调用t2.join时正在运行的是线程t1,所有主线程t1进入millis – now的阻塞状态,当时间超过millis – now毫秒是主线程将被唤醒。

 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;
            }
        }
    }

这里解释一下wait()和isAlive()方法的来源。

isAlive方法被native关键字标注了,表明了要调用其他语言进行协助。所以isAlive方法体不用Java来写,wait方法也如此

public final native boolean isAlive();

wait方法也被native关键字标注了,表明了要调用其他语言进行协助。

public final native void wait(long timeoutMillis) throws InterruptedException;

更多wait()方法的信息参考博客
https://blog.csdn.net/jiangzhexi/article/details/81152617.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137811.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • dedecms列表页有图调用缩略图无图留空的方法

    dedecms列表页有图调用缩略图无图留空的方法

    2021年9月25日
    42
  • 大数据挖掘技术在电网状态监测与诊断中的应用

    大数据挖掘技术在电网状态监测与诊断中的应用

    2021年11月22日
    50
  • 金融公司2014年度工作总结与2015年度工作计划

    金融公司2014年度工作总结与2015年度工作计划正文:一、 员工个人对全年重点工作、核心绩效指标进行罗列。自6月入职以来参加730、825、917、1015、1126的版本测试,测试的各个功能点,前台涉及的测试功能点包括广发、汇添富的申购、赎回,基金双持,票据购买、冻结收银台、理财管理、后台功能点包括用户开户信息查询等各种报表处理、申购异常处理、赎回异常处理、强制赎回等异常处理、定时任务管理、日常管理包括基础配置管理、基金管理中的…

    2022年7月26日
    8
  • 分辨率,像素,像素密度易懂

    分辨率,像素,像素密度易懂分辨率是什么?一般会说这个屏幕的分辨率是1920*1080,这就说明纵向和横向上有1920个和1080个像素点;像素点是什么?一个像素点就是一个色彩块,没有实际的物理尺寸;什么是屏幕像素密度?一英寸长的一条线上理论上会有多少个像素点;例如:一个手机长边有1920个像素点,短边有1080个像素点,屏幕大小(对角线的物理大小)是5.2英寸的,那么屏幕密度是怎么计…

    2022年5月4日
    61
  • 《Android应用开发揭秘》连载3

    《Android应用开发揭秘》连载3《Android应用开发揭秘》  书名:Android应用开发揭秘作者:杨丰盛出版社:机械工业出版社ISBN:9787111291954出版日期:2010年3月(1版2次)开本:16页码:515版次:1-2定价:69元豆瓣网讨论地址:http://www.douban.com/subject/4200822/China-pub预订地址:http://www.china-pub.

    2022年6月10日
    41
  • C++键盘钩子

    C++键盘钩子C++键盘钩子Windows系统是建立在事件驱动的机制上的,整个系统都是通过消息传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的…

    2022年4月26日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号