JAVA多线程-线程间通信(四)-join的使用
2016-02-21 10:04
537 查看
方法join的使用
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结。这时,如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要取得这个数据中的值,就要用到join()这个方法了。方法join()的作用是等待线程对象销毁。
demo案例:
![](http://img.blog.csdn.net/20160220181455113)
结果分析:
方法join的作用是使所属的线程对象A正常执行run()方法中的任务,而使当前主线程无期限的阻塞,等待线程A销毁后,再继续执行主线程后面的代码。
方法join具有使线程排队的作用,有些类似同步的运行效果。
join详解:
1、join与synchronized的区别:
join在内部使用wait()进行等待,而synchronized关键字使用的是“对象监视器”原理做为同步。
2、join与interrupt彼此遇到的话,则会出现异常。
3、join(long):参数为设定等待时间。表示主线程只等待子线程x秒,在X秒之间内,子线程结束,则唤醒主线程;否则,直接唤醒主线程。
4 、join(long)与sleep(long)的区别:
由于join(long)的内部使用的是wait(long),所以它具有释放锁的特点,而sleep(long)不会释放锁。
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结。这时,如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要取得这个数据中的值,就要用到join()这个方法了。方法join()的作用是等待线程对象销毁。
demo案例:
package org.jksoft.thread.join; /** * 测试案例一:让主线程在子线程结束之后,再结束。我们利用的是join方法 * @author mcl * * 2016-2-20-下午6:08:36 */ public class Test1 { public static void main(String[] args) { Thread thread = new TestThread("子线程"); thread.start(); try { thread.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("我等到子线程结束了"); } } class TestThread extends Thread{ public TestThread(String name){ this.setName(name); } public void run(){ long a = (long)(Math.random()*10000); try { sleep(a); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+a); } }运行结果:
结果分析:
方法join的作用是使所属的线程对象A正常执行run()方法中的任务,而使当前主线程无期限的阻塞,等待线程A销毁后,再继续执行主线程后面的代码。
方法join具有使线程排队的作用,有些类似同步的运行效果。
join详解:
1、join与synchronized的区别:
join在内部使用wait()进行等待,而synchronized关键字使用的是“对象监视器”原理做为同步。
2、join与interrupt彼此遇到的话,则会出现异常。
3、join(long):参数为设定等待时间。表示主线程只等待子线程x秒,在X秒之间内,子线程结束,则唤醒主线程;否则,直接唤醒主线程。
4 、join(long)与sleep(long)的区别:
由于join(long)的内部使用的是wait(long),所以它具有释放锁的特点,而sleep(long)不会释放锁。
相关文章推荐
- Tiny Spring 分析一
- Java代码实践12306售票算法(二)
- Java 集合系列07之 Stack详细介绍(源码解析)和使用示例
- Java NIO 同步非阻塞Socket DEMO
- java命令
- Java构造器和方法的区别
- Java-----Excel转HTML
- java基础
- Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
- Java多线程的通信3
- LeetCode_2_AddTwoNumbers(Java Code)
- 基于Java代码实现数字在数组中出现次数超过一半
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- java中观察者模式的使用场景
- 大白话: JAVA反射机制
- java 基础异常使用总结
- java中的堆Heap和栈Stack的区别
- 使用eclipse向yarn提交job
- 使用eclipse连接hadoop
- java构造函数