join方法:一个线程A插队到一个线程B之前,线程A阻塞
返回值类型 | 方法 | 解释 |
---|---|---|
void | join() | 等待该线程终止。 |
void | join(long millis) | 等待该线程终止的时间最长为 millis 毫秒 |
void | join(long millis, int nanos) | 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒 |
线程A:
package com.thread.join;
public class ThreadA extends Thread{
private ThreadB tb;
public void setTb(ThreadB tb){
this.tb = tb;
}
@Override
public void run() {
for( int i = 0 ; i < 100 ; i++ ){
System.out.println("ThreadA------------"+i);
try {
//线程tb使用join方法,插队到线程ta之前
//无参数的join方法,使用时是等到插队线程(tb)执行完成之后,才能执行被插队的线程(ta)
//带参数的join方法,使用时是等到插队线程(tb)的插队时间完成之后,去执行被插队的线程(ta)
tb.join(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
线程B:
package com.thread.join;
public class ThreadB extends Thread{
@Override
public void run() {
for( int i = 0 ; i < 100 ; i++ ){
System.out.println("ThreadB----"+i);
}
}
}
线程测试类:
package testJoin;
import com.thread.join.ThreadA;
import com.thread.join.ThreadB;
public class TestJoin {
public static void main(String[] args){
ThreadA ta = new ThreadA();
ta.start();
ThreadB tb = new ThreadB();
tb.start();
ta.setTb(tb);
}
}
注意join方法带参数与不带参数的区别:
1. 无参数的join方法,使用时是等到插队线程(tb)执行完成之后,才能执行被插队的线程(ta)
2. 带参数的join方法(参数:该线程tb的插队时长),使用时是等到插队线程(tb)的插队时间完成之后,插队线程(tb)退出插队,和被插队的线程(ta)共同等待调度程序的调度。
3. 谁插队,谁执行,谁执行,谁阻塞
4. 有可能出现空指针异常,解决方法如下:
将插队线程(ta)类里面的setTb方法去掉,换成如下代码:
public ThreadA(ThreadB tb){
this.tb = tb;
}
测试代码如下:
package testJoin;
import com.thread.join.ThreadA;
import com.thread.join.ThreadB;
public class TestJoin {
public static void main(String[] args){
ThreadB tb = new ThreadB();
tb.start();
ThreadA ta = new ThreadA(tb);
ta.start();
//ta.setTb(tb);
}
}