Thread.sleep方法及其用sleep方法模拟龟兔赛跑

本文介绍了Thread.sleep方法的使用,包括如何通过它进行线程休眠和模拟倒计时、龟兔赛跑等场景。强调了sleep方法在多线程中的作用,如让其他线程有机会执行,以及在模拟时间延迟中的应用。同时指出,线程的终止不应使用stop方法,而应通过标志位判断。并提供了使用TimeUnit进行更精确的线程睡眠控制的建议。
摘要由CSDN通过智能技术生成

1.Thread.sleep方法

    public static native void sleep(long millis) throws InterruptedException;

1.sleep是一个静态的本地方法
2.参数是毫秒long millis
3.让当前线程进入休眠,进入“阻塞”状态,放弃占有CPU时间片,让给其他线程使用。
也就是说:暂停当前线程,把cpu片段让出给其他线程,减缓当前线程的执行。

2.用sleep模拟按秒计时

package com.thread.threadsleep;

import java.text.SimpleDateFormat;
import java.util.Date;

//模拟倒计时
public class TestSleep2 {
    public static void main(String[] args) {
        //打印当前系统时间
        Date startTime = new Date(System.currentTimeMillis());//获取当前时间
        while (true){
            try {
                Thread.sleep(1000);
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
                startTime = new Date(System.currentTimeMillis());//更新时间

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void tenDown() throws InterruptedException {
        int num =10;
        while (true){
            Thread.sleep(1000);
            System.out.println(num--);
            if (num<=0){
                break;
            }
        }
    }
}

3.用sleep方法模拟龟兔赛跑

//模拟龟兔赛跑
public class Race implements Runnable {
    private static String winnner;
    @Override
    public void run() {
        for (int i = 1; i <=100; i++) {
            //模拟兔子休息
            if (Thread.currentThread().getName().equals("兔子") && i%10==0){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //判断比赛是否结束
            boolean flag = gameOver(i);
            if (flag){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"跑了"+i+"步");
        }
    }
    //判断是否完成比赛
    private boolean gameOver(int step){
        if (winnner != null){//已经有胜利者了
            return true;
        }else if (step >= 100){
            winnner = Thread.currentThread().getName();
            System.out.println("Winner is "+winnner);
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        Race race =new Race();
        new Thread(race,"兔子").start();
        new Thread(race,"乌龟").start();

    }
}

这里应用一个标志位 boolean flag = gameOver(i);判断比赛是否结束,来终止线程。终止线程不能用stop方法****种方式是直接将线程杀死了。
线程没有保存的数据将会丢失。
注意:
一般睡眠可以用

   TimeUnit.

注意事项参考https://blog.csdn.net/feigeswjtu/article/details/78700101

  1. sleep是帮助其他线程获得运行机会的最好方法,但是如果当前线程获取到的有锁,sleep不会让出锁。
  2. 线程睡眠到期自动苏醒,并返回到可运行状态(就绪),不是运行状态。
  3. 优先线程的调用,现在苏醒之后,并不会里面执行,所以sleep()中指定的时间是线程不会运行的最短时间,sleep方法不能作为精确的时间控制。
  4. sleep()是静态方法,只能控制当前正在运行的线程。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值