作用: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;
}
@Override
publicvoid 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{
@Override
publicvoid 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;
}
@Override
publicvoid 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.0
myService do sth.1
myService do sth.2
.
.
.
myService do sth.99
B thread is over.
b do sth....
b do sth....
.
.
.
可见线程在join()之后是释放锁的,其他线程可以访问同锁的synchronize方法。
需要注意的问题:join()后的方法有可能会提前运行:(这个没试出来)
我们同时执行以下三个操作:
①.thread1.start();
②.thread2.start();
③.sysout
哪个先运行是不确定的,不过①和②的操作是相同的锁,所以是互斥的。