java线程中的join方法

1.线程的join方法可以用来让本线程插队,强行占用cpu执行权;
2.现有线程A在cpu上运行,另一个线程B调用自己的join方法,强行把正在运行的线程A退回到等待状态,线程B自己进入cpu运行。

注意:

1.join它只能用于控制线程的执行顺序,让从线程穿插到主线程执行路径的某个点位上;
2.若多个线程都join到了主线程的执行路径,从线程间是串行执行的,故join不能提高并发度,所以它往往用于从线程需要串行的,主等从线程的场景;
3.若既要实现主等从,又要从线程间并发执行,还得用CountDownLatch
4.Semaphore的控制思路类似流控中的令牌桶,semaphore的作用也类似流控,作用对象都是在从线程,被阻塞、令牌借用、令牌释放都发生在从线程上。

一定要注意线程任务中的:异常捕获,并在finally块释放锁

Thread.currentThread().join();  //这个调用会导致死锁(打断自己的执行,自己穿插进去,自己又等待自己执行完成)
  1. 示例代码:
package com.cxf.multithread.join;
 
public class TestForJoin implements Runnable{
    
public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new TestForJoin());
        thread.start();
        
        for (int i = 0; i < 6; i++) {
            if(i==2){
                thread.join();  //插队
            }
            System.out.println("main is running");
        }

    }
 
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("i am running");
        }
    }
}
  1. 程序输出:
main is running
main is running

i am running
i am running
i am running
i am running
i am running

main is running
main is running
main is running
main is running