Java多线程:线程调度Join

来源:互联网 发布:免费提词器软件 编辑:程序博客网 时间:2024/05/19 21:15
public final void join() throws InterruptedException
等待该线程终止。
public final void join(long millis) throws InterruptedException
等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。
public final void join(long millis, int nanos) throws InterruptedException
等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
package basic.c_join;public class TestJoinA {public static void main(String[] args) {Thread t = new Thread(new TestRunnableImpl());t.start();try {t.join(1000); // 主线程只等1秒,不管子线程什么时候结束System.out.println("joinFinish");} catch (InterruptedException e) {e.printStackTrace();}}}class TestRunnableImpl implements Runnable {public void run() {try {System.out.println("Begin sleep");// 如果改成sleep(2000), 那么主线程就会先结束Thread.sleep(1000);System.out.println("End sleep");} catch (InterruptedException e) {e.printStackTrace();}}}
其实Join 方法实现是通过wait (小提示:Object 提供的方法)。 当main 线程调用t.join 时候,main 线程会获得线程对象t 的锁 (wait 意味着拿到该对象的锁), 调用该对象的wait( 等待时间) ,直到该对象唤醒main 线程,比如退出后。
这就意味着main 线程调用t.join 时,必须能够拿到线程t 对象的锁 ,如果拿不到它是无法wait 的,刚开的例子t.join(1000) 不是说明了main 线程等待1 秒,如果在它等待之前,其他线程获取了t 对象的锁,它等待时间可不就是1 毫秒了。
package basic.c_join;import org.apache.log4j.Logger;public class TestJoinB {private static Logger logger = Logger.getLogger(TestJoinB.class);public static void main(String[] args) {Thread t = new Thread(new RunnableImpl());new ThreadTest(t).start();// 这个线程会持有锁t.start();try {// 因为线程对象t的锁已经被其他线程获得, 要logger.debug("beforejoin");t.join();logger.debug("joinFinish");} catch (InterruptedException e) {e.printStackTrace();}}}class ThreadTest extends Thread {private static Logger logger = Logger.getLogger(ThreadTest.class);Thread thread;public ThreadTest(Thread thread) {this.thread = thread;}@Overridepublic void run() {logger.debug("run1 before");holdThreadLock();logger.debug("run1 end");}public void holdThreadLock() {synchronized (thread) {logger.debug("getObjectLock");try {Thread.sleep(9000);} catch (InterruptedException ex) {ex.printStackTrace();}logger.debug("ReleaseObjectLock");}}}class RunnableImpl implements Runnable {private static Logger logger = Logger.getLogger(RunnableImpl.class);public void run() {logger.debug("run2 before");try {logger.debug("Begin sleep");Thread.sleep(2000);logger.debug("End   sleep");} catch (InterruptedException e) {e.printStackTrace();}logger.debug("run2 end");}}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 红米2完全黑屏怎么办 红米note3接电话黑屏怎么办 红米note3死机黑屏怎么办 红米note2开机之后黑屏怎么办 红米手机白屏怎么办 红米4黑屏打不开怎么办 oppo手机拨打电话时黑屏怎么办 华为手机拨打电话时黑屏怎么办 小米6x拨电话黑屏怎么办 魅族手机打电话黑屏怎么办 三星手机拨打电话时黑屏怎么办 华为畅享5打电话黑屏怎么办 小米note通话声音小怎么办 金立m5黑屏开不了机怎么办 金立手机光感器坏了怎么办 红掌根部烂了怎么办 魅族相册闪退怎么办 魅族手机闪退怎么办 苹果6手机主页面打不开怎么办 手机中病毒闪退怎么办 酷派手机开机黑屏怎么办啊 酷派手机黑屏打不开怎么办 酷派手机不开机怎么办 乐视手机开不了机怎么办 vivo手机拨号键盘不见了怎么办 华为手机拨号键盘不见了怎么办 金立手机拨号键盘不见了怎么办 酷派手机home键失灵怎么办 r11屏碎一半黑屏怎么办 金立手机黑屏打不开怎么办 小米8se自动跳出广告怎么办 小米手机总跳出广告怎么办 小米手机总是出现广告怎么办 红米1s开机黑屏怎么办 红米手机打电话黑屏怎么办 小米4c打游戏卡怎么办 电脑总出现拨号连接怎么办 win10电脑没有拨号连接怎么办 红米手机黑屏了怎么办 小米4s黑屏了怎么办 鼠标的左键失灵怎么办