Thread线程join方法自我理解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thread线程join方法自我理解相关的知识,希望对你有一定的参考价值。
Thread线程join方法自我理解
thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.join();后面的代码
thread.join(long time):线程thread等待time时间之后,main-thread可以执行,注意time时间后,线程thread没有执行完,main-thread也可以运行
注意:上面2个方法必须在线程是alive的时候,才有这样的效果,否则不会有。
join()方法源码是有调用wait()方法的,wait方法是Object的方法,线程wait时,是释放对象锁的,所以调用join()方法是释放对象锁的线程阻塞同wait()方法。
class Runner1 implements Runnable{ @Override public void run() { try { System.out.println(Thread.currentThread().getName() + " begin..."); Thread.sleep(2000);//① } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " finish..."); } } class Runner2 implements Runnable{ @Override public void run() { try { System.out.println(Thread.currentThread().getName() + " begin..."); Thread.sleep(1000);//② } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " finish..."); } } public class Test_thread_join { /** * Thread.join()等待线程结束,再执行Thread.join后面的代码 * Thread.join(n)等待线程结束或者n时间后,执行Thread.join后面的代码 */ public static void main(String[] args) { Runner1 r1 = new Runner1(); Runner2 r2 = new Runner2(); Thread t1 = new Thread(r1, "Thread-A"); Thread t2 = new Thread(r2, "Thread-B"); t1.start();//t1是alive的 t2.start(); try { t1.join();//当执行这个代码的时候,main线程阻塞,t2.这个线程可能运行着,也可能结束了 t2.join();//如果在t1.join()执行的时候,t2线程已经运行结束,那这行代码是没有效果的③ } catch (InterruptedException e) { e.printStackTrace(); } run(); } public static void run(){ for(int i = 0; i < 5; i++){ System.out.println("main i:" + i); } } }
大意:①Thread-A睡眠2秒,②Thread-B睡眠1秒
执行结果:
结论:t1.join();执行时,main方法阻塞等待t1线程执行完;t1线程执行完之后,程序执行t2.join(),此时t2线程已经死亡了运行结束了,这行代码没有效果没有意义。如果t2没有死亡,那么main-thread,必须等待Thread-B死亡,才能执行后面的代码。如果③这行代码被注释了,并且t1.join()执行完之后t2线程仍然是alive的,那么main-thread和Thread-B线程将竞争CPU资源,他们的运行方式可能是交互式的。
以上是关于Thread线程join方法自我理解的主要内容,如果未能解决你的问题,请参考以下文章