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、线程调度程序可以决定将当前运行状态移动到可运行状态,以便让另一个线程获得运行机会,而不需要任何理由。

 

posted @ 2021-07-09 11:26  归来仍是少年-youg  阅读(86)  评论(0)    收藏  举报