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(); //这个调用会导致死锁(打断自己的执行,自己穿插进去,自己又等待自己执行完成)
- 示例代码:
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");
}
}
}
- 程序输出:
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