java基础-多线程-sleep、yield、join
愿历尽千帆,归来仍是少年
sleep目的:线程休眠,让其他线程有机会执行
sleep注意:
1、线程睡眠是帮助所有线程获得运行机会的最好方法。
2、线程睡眠到期自动苏醒,并返回到可运行状态,不是运行状态。sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始执行。
3、sleep()是静态方法,只能控制当前正在运行的线程。
sleep方式:
运行状态 ----> 阻塞态(sleep)----> 运行状态
sleep demo:
@ApiOperation(value = "basic线程测试-sleep", notes = "basic线程测试-sleep") @GetMapping(value = "/startSleepThread") public Response startSleepThread(){ // Thread类 // 新状态 BasicSleepThread t1 = new BasicSleepThread(); // 可运行状态 t1.start(); return Response.ok(); }
/**
* 基础线程测试-sleep
*
* @author hxx
* @version 1.0
* @date 2021/7/9 10:29
*/
public class BasicSleepThread extends Thread {
public static Logger logger = LogManager.getLogger(BasicSleepThread.class);
public BasicSleepThread() {
}
public BasicSleepThread(String param) {
super(param);
}
public void run() {
logger.info("BasicSleepThread start!!!");
// 运行态
for (int i = 0; i < 100; i++) {
if ((i) % 10 == 0) {
System.out.println("-------" + i);
}
try {
// 阻塞态
Thread.sleep(1);
System.out.println(i + " 线程睡眠1毫秒!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 死亡态
}
}
yield:
Thread.yield()作用:暂停当前正在执行的线程对象,并执行其他线程。
结论:yield只是让线程从运行状态 ---> 可运行状态,但有可能没有效果(被线程调度程序再次选中), 未导致线程到 等待/睡眠/阻塞状态
join:
作用:Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作
Thread t = new MyThread(); t.start(); t.join();
等待:join()方法还有带超时限制的重载版本。例如t.join(5000);则让线程等待5000毫秒,如果超过这个时间,则停止等待,变为可运行状态。
小结
到目前位置,介绍了线程离开运行状态的3种方法:
1、调用Thread.sleep():使当前线程睡眠至少多少毫秒(尽管它可能在指定的时间之前被中断)。
2、调用Thread.yield():不能保障太多事情,尽管通常它会让当前运行线程回到可运行性状态,使得有相同优先级的线程有机会执行。
3、调用join()方法:保证当前线程停止执行,直到该线程所加入的线程完成为止。然而,如果它加入的线程没有存活,则当前线程不需要停止。
除了以上三种方式外,还有下面几种特殊情况可能使线程离开运行状态:
1、线程的run()方法完成。
2、在对象上调用wait()方法(不是在线程上调用)。
3、线程不能在对象上获得锁定,它正试图运行该对象的方法代码。
4、线程调度程序可以决定将当前运行状态移动到可运行状态,以便让另一个线程获得运行机会,而不需要任何理由。

浙公网安备 33010602011771号