多线程(七)~join方法的使用
作用: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
哪个先运行是不确定的,不过①和②的操作是相同的锁,所以是互斥的。
浙公网安备 33010602011771号