多线程Java
线程合并
/*
* 线程合并
*
* 1. 调用join()方法完成线程合并。
*
* 2. join()方法是一个实例方法。(不是静态方法)t.join
*
* 3. 假设在main方法(main线程)中调用了 t.join(),后果是什么?
* t线程合并到主线程中。主线程进入阻塞状态。直到 t 线程执行结束。主线程阻塞解除。
*
* 4. t.join()方法其实是让当前线程进入阻塞状态,直到t线程结束,当前线程阻塞解除。
* 5. 和sleep方法有点类似,但不一样:
* 第一:sleep方法是静态方法,join是实例方法。
* 第二:sleep方法可以指定睡眠的时长,join方法不能保证阻塞的时长。
* 第三:sleep和join方法都是让当前线程进入阻塞状态。
* 第四:sleep方法的阻塞解除条件?时间过去了。 join方法的阻塞解除条件?调用join方法的那个线程结束了。
*/
* - sleep(毫秒) 可精确指定“线程阻塞多久后自动唤醒”;
* - join() 无法主动指定阻塞时长,完全依赖“被调用线程(如 t )何时执行完毕” 。若 t 线程执行耗时不确定(如处理大数据),join 的阻塞时长也不确定。
* 3. 阻塞触发的本质:
* - 两者都会让「当前线程」进入阻塞状态,但触发阻塞的条件不同:
* → sleep:到达指定时间后,线程自动解除阻塞;
* → join:被调用的目标线程(如 t )执行完毕后,当前线程才会解除阻塞。
线程让位
yield() 方法是静态的,因此直接通过 Thread 类名来调用,不需要创建 Thread 实例。
2. 作用原理
当一个线程调用 yield() 方法时,它会主动放弃当前剩余的 CPU 执行时间片,将自己的状态从运行状态切换到可运行状态(就绪状态),然后重新进入线程调度队列,等待系统再次分配 CPU 时间片来执行。
与 sleep() 方法的区别
- 阻塞性质: yield() 方法不会使线程进入阻塞状态,只是让线程回到就绪状态;
而 sleep() 方法会使线程进入阻塞状态,在指定的时间内不会参与 CPU 调度。
- 执行时间控制: yield() 方法无法控制具体的让出 CPU 执行权的时间;
sleep() 方法可以精确指定线程阻塞的时间长度。
- 线程优先级影响: yield() 方法主要影响同优先级的线程;
sleep() 方法对线程优先级没有这种影响,在睡眠结束后,线程会根据其优先级参与 CPU 调度。