java,多线程时用的join()函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java,多线程时用的join()函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1901字,纯文字阅读大概需要3分钟。
内容图文
![java,多线程时用的join()函数](/upload/InfoBanner/zyjiaocheng/631/2339a3003caf4ceb9772d9b435fb06d2.jpg)
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()的底层代码,在线程A内部调用线程B的join()函数时,会暂停A线程,等线程B执行结束后才会结束暂停。如果调用的join带有时间参数,则时间计时结束也会结束wait()过程。
上面的isAlive()和wait()的函数对象是不一样的,isAlive对象是被调用的线程(B),wait(0)的对象是对应的是正在执行的线程(A)。
另一个要注意的点是,线程的状态大致分为开始、就绪、运行、阻塞和死亡,isAlive()仅在就绪或者运行时算作真,故未start的线程join无效。
下面举个例子
设置两个线程类 ,并在一个子线程中调用另一个线程的join方法。
public class Thread1 extends Thread { public Thread1(String name) { super(name); } @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println(Thread.currentThread().getName() + ":"+i); } } }
public class Thread2 extends Thread { public Thread2(String name) { super(name); } @Override public void run() { Thread1 B = new Thread1("B"); B.start(); try { B.join(); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < 3; i++) { System.out.println(Thread.currentThread().getName() + ":"+i); } } }
主类中按一定次序启用线程
public class Thread2 extends Thread { public Thread2(String name) { super(name); } @Override public void run() { Thread1 B = new Thread1("B"); B.start(); try { B.join(); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < 3; i++) { System.out.println(Thread.currentThread().getName() + ":"+i); } } }
得到结果如下
可以看到,在A中启用B的join方法时,并未影响到主线程,主线程仍然向后运行并开启了D,而A只能在B之后得到运行。主线程中启用D的join方法后,则暂停执行,即E暂时无法start。
内容总结
以上是互联网集市为您收集整理的java,多线程时用的join()函数全部内容,希望文章能够帮你解决java,多线程时用的join()函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。