1.方法join()的作用是等待线程对象销毁。
2.方法join()的作用是使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期阻塞,等待线程x销毁后再继续执行线程z后面的代码。
因此,join()具有使线程排队运行的效果。
join与synchronized的区别:join在内部使用wait()方法进行等待,而synchronized关键字使用的是对象监视器原理作为同步。
3.join(long)等待毫秒数
与sleep(long) 区别
Thread.sleep(long)当前线程不释放锁
t.join(long)释放当前锁。
4.join()后的代码提前运行
线程A
public class Threada extends Thread{
private Threadb b;
public Threada(Threadb b){
this.b = b;
}
public void run(){
try {
synchronized (b) {
System.out.println("begin A name="+Thread.currentThread().getName()+" .. "+System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("end A name="+Thread.currentThread().getName()+" .. "+System.currentTimeMillis());
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
线程B
public class Threadb extends Thread{
synchronized public void run(){
try {
System.out.println("begin B name="+Thread.currentThread().getName()+" .. "+System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("end B name="+Thread.currentThread().getName()+" .. "+System.currentTimeMillis());
} catch (Exception e) {
// TODO: handle exception
}
}
}
执行
public class Run {
public static void main(String[] args) {
try {
Threadb b = new Threadb();
Threada a = new Threada(b);
a.start();
b.start();
b.join(2000);//之后的main语句先打印出来
System.out.println("main end"+System.currentTimeMillis());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}