java并发编程基础
Join方法
/**
* @Auther: match
* @Date: 2021/2/22 12:21
* @Description:
*/
public class JoinDemo {
public static void main(String[] args) throws InterruptedException {
Task1 task1 = new Task1();
Task2 task2 = new Task2();
Thread t1 = new Thread(task1);
Thread t2 = new Thread(task2);
t1.start();
t2.start();
t1.join();
t2.join();
}
public static class Task1 implements Runnable{
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("child trheadOne over");
}
}
public static class Task2 implements Runnable{
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("child trheadtwo over");
}
}
}
如上代码在主线程里面启动了两个子线程,然后分别调用了它们的join()方法,那么主线程首先会在调用threadOne.join()方法后被阻塞,等待threadOne执行完毕后返回。threadOne执行完毕后threadOne.join()就会返回,然后主线程调用threadTwo.join()方法后再次被阻塞,等待threadTwo执行完毕后返回。
public class JoinDemo2 {
public static void main(String[] args) {
Thread threadOne = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("ThreadOne begin run.");
while (true) {
}
}
});
//get main thread
Thread mainThread = Thread.currentThread();
Thread threadTwo = new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//此语句会在主线程的threadOne.join()处会抛出InterruptedException异常
mainThread.interrupt();
}
});
//启动子线程
threadOne.start();
// 延时1秒启动线程2
threadTwo.start();
try {
threadOne.join();
} catch (InterruptedException e) {
System.out.println("main thred:" +e);