作用:join()方法的作用是等待线程对象销毁。
join()方法具有能使线程排队运行的作用,有点类似于同步的效果。 join与synchronize的区别: join在内部使用wait()方法进行等待,底层用wait()来实现。 synchronize关键字是以“对象监视器”为原理做同步操作。 join()除了无参方法之外,还重载了join(毫秒)的方法,此方法与sleep(毫秒)的区别是: join()操作底层用wait()来实现,可以释放锁。 sleep()不会释放锁。 join()释放锁的demo: 线程类A: package com.wang.myjoin;publicclassThreadAextendsThread{privateThreadB threadB;publicThreadA(ThreadB threadB){this.threadB = threadB;}@Overridepublicvoid run(){synchronized(threadB){ threadB.start();try{ threadB.join();}catch(InterruptedException e1){ e1.printStackTrace();}for(int i =0;i<10000;i++){System.out.println("b do sth....");}}}} 线程类B: package com.wang.myjoin;publicclassThreadBextendsThread{@Overridepublicvoid run(){System.out.println("B thread is run.");try{Thread.sleep(2000);}catch(InterruptedException e){ e.printStackTrace();}System.out.println("B thread is over.");}publicsynchronizedvoid myService(){for(int i =0;i<100;i++){System.out.println("myService do sth."+ i);}}} 线程类C: package com.wang.myjoin;publicclassThreadCextendsThread{privateThreadB threadB;publicThreadC(ThreadB threadB){this.threadB = threadB;}@Overridepublicvoid run(){ threadB.myService();}} 测试类: package com.wang.myjoin;publicclassJoinTest{publicstaticvoid main(String[] args){ThreadB threadB =newThreadB();ThreadA threadA =newThreadA(threadB); threadA.start();ThreadC threadC =newThreadC(threadB); threadC.start();System.out.println("~~~我来测试一下~~~~");}} 输出结果: B thread is run.~~~我来测试一下~~~~myService do sth.0myService do sth.1myService do sth.2...myService do sth.99B thread is over.b do sth....b do sth....... 可见线程在join()之后是释放锁的,其他线程可以访问同锁的synchronize方法。 需要注意的问题:join()后的方法有可能会提前运行:(这个没试出来) 我们同时执行以下三个操作: ①.thread1.start(); ②.thread2.start(); ③.sysout 哪个先运行是不确定的,不过①和②的操作是相同的锁,所以是互斥的。 来自为知笔记(Wiz)转载于:https://www.cnblogs.com/douJiangYouTiao888/p/6473815.html