线程休眠(sleep)

线程休眠:sleep()

注意点:

  1. sleep(时间)指定当前线程阻塞的毫秒数
  2. sleep存在异常InterruptedException
  3. sleep时间达到后线程进入就绪状态
  4. sleep可以模拟网络延时,倒计时等
  5. 每一个对象都有一个锁,sleep不会释放锁;

示例一:我们拿售票的例子演示模拟网络延迟

上代码

package com.kuang.thread;

/**
 * @ClassName TestSleep1
 * @Description 线程休眠  模拟网络延迟
 * @Author 麻虾
 * @Date 2021/4/27 20:27 27
 * @Version 1.0
 */

//每个对象都有一把锁,sleep不会释放锁

//sleep模拟网络延迟
    //最大的作用:放大问题的发生性。   比如这个,没有延迟,看不出错误,有了延迟就看出来了问题

public class TestSleep1 implements Runnable {

    //票数
    private int ticketNums = 10;

    @Override
    public void run() {
        //线程体
        //买票  只要还有票,就一直拿
        while (true) {
            //判断什么时候结束
            if (ticketNums <= 0) {
                break;
            }

            System.out.println(Thread.currentThread().getName() + "---->抢到了第" + ticketNums-- + "张票");

        }
    }

    public static void main(String[] args) {
        TestSleep1 testTicket = new TestSleep1();

        new Thread(testTicket,"学生 ").start();
        new Thread(testTicket,"老师").start();
        new Thread(testTicket,"校长").start();
    }
}

以上代码是没有模拟延迟的,我们先看一下没有模拟延迟的结果如何:

校长---->抢到了第9张票
学生 ---->抢到了第8张票
学生 ---->抢到了第6张票
学生 ---->抢到了第5张票
学生 ---->抢到了第4张票
学生 ---->抢到了第3张票
学生 ---->抢到了第2张票
学生 ---->抢到了第1张票
老师---->抢到了第10张票
校长---->抢到了第7张票

发现:结果貌似没有什么问题。

我们把在run()里面加入以下模拟延迟的代码:

//模拟延迟:sleep(毫秒),sleep需要捕获异常
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

再来看一下结果:

学生 ---->抢到了第8张票
校长---->抢到了第9张票
老师---->抢到了第10张票
老师---->抢到了第7张票
学生 ---->抢到了第5张票
校长---->抢到了第6张票
学生 ---->抢到了第4张票
老师---->抢到了第3张票
校长---->抢到了第2张票
校长---->抢到了第1张票
老师---->抢到了第1张票
学生 ---->抢到了第1张票

发现:出现了数据紊乱,学生,校长,老师都拿到了第1张票,线程是不安全的

这就体现了sleep() 最大的作用:放大问题的发生性。 比如这个,没有延迟,看不出错误,有了延迟就看出来了问题 

 示例二:利用sleep实现倒计时/获取系统时间

1.打印系统当前时间 (每隔一秒打印一次时间)

package com.kuang.thread;

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

/**
 * @ClassName TestSleep2
 * @Description 线程休眠
 * @Author 麻虾
 * @Date 2021/4/27 20:52 52
 * @Version 1.0
 */

    public static void main(String[] args) {

        //打印当前系统时间  常用类Data,在java.util
            //获取系统当前时间System.currentTimeMillis()
        Date startTime = new Date(System.currentTimeMillis());

        while (true){
            //每隔一秒打印一次时间
            try {
                Thread.sleep(1000);
                //打印时间
                    //时间格式化工厂SimpleDateFormat("HH:mm:ss")
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
                //更新当前时间
                startTime = new Date(System.currentTimeMillis());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

结果如下:不停地(每隔一秒)打印系统当前时间

00:37:20
00:37:21
00:37:22
00:37:23
00:37:24
00:37:25
00:37:26
00:37:27
00:37:28
00:37:29
00:37:30
00:37:31
00:37:32
00:37:33
00:37:34
00:37:35

2.倒计时

package com.kuang.thread;

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

/**
 * @ClassName TestSleep2
 * @Description 线程休眠 模拟倒计时
 * @Author 麻虾
 * @Date 2021/4/27 20:52 52
 * @Version 1.0
 */

//模拟倒计时

public class TestSleep2 {
    public static void tenDown() throws InterruptedException{
        int num = 10;
        //每一秒钟走一下,走十秒钟
        while (true){
            //一定别忘了sleep需要捕获异常,也可以在方法出抛出throws异常
            Thread.sleep(1000);
            System.out.println(num--);
            if (num <= 0){
                break;
            }
        }
    }

    public static void main(String[] args) {

        //1.倒计时
        //定义方法时抛出了异常,所以调用的时候也必须捕获异常,否则报错
        try {
            tenDown();
        }catch (InterruptedException e){
            e.printStackTrace();
        } 
    }
}

结果如下:

10
9
8
7
6
5
4
3
2
1

Process finished with exit code 0

 

### C++ 和其他编程语言中的 `sleep` 函数 在不同编程语言中,`sleep` 函数的行为有所不同。对于C++而言,在C++11之前确实未提供专门的休眠函数,而使用的是一些系统级别的函数来实现休眠功能[^1]。 #### Windows 系统下的 Sleep 函数 在Windows操作系统环境中,可以通过调用`Sleep(unsigned long dwMilliseconds)`来进行指定毫秒数的时间延迟操作;例如: ```cpp #include <windows.h> // ... Sleep(2 * 1000); // 让当前线程暂停执行两秒钟 ``` #### 类 Unix 系统下的 sleep 函数 而在类Unix系统上,则通常采用标准库提供的`sleep()`或者更精确控制时间间隔的`usleep()`函数,它们接受以秒为单位整数值作为参数输入,并且仅支持整数部分表示的时间长度。需要注意的是这些API会使整个进程进入等待状态而不是单独影响某个特定线程。 为了只让单个线程休眠而不干扰到其它正在运行着的任务,应该考虑利用POSIX Threads (pthreads) 库所提供的接口比如pthread_cond_timedwait()等替代方案[^3]。 #### Python 中的 Time.sleep 方法 相比之下,在Python里通过导入time模块之后就可以很方便地使用`time.sleep(seconds)`语句使当前线程暂停给定数量秒数继续往下走,这里seconds既可以是一个正整数也允许传入浮点型数据以便更加精细地调整延时期间[^2]: ```python import time print("Start sleeping...") time.sleep(1.5) # 当前线程将被阻塞1.5秒 print("Wake up!") ``` 值得注意的是尽管此方法名称中含有“thread”,但它实际上作用于调用了它的那个具体线程而非整个应用程序实例。 #### Java 的 Thread.sleep 静态方法 最后来看Java的情况,这里的`Thread.sleep(long millis)`也是一个用来暂时停止当前正在执行的工作单元的有效手段之一。由于它是定义成static的形式存在的因此可以直接经由类本身去访问无需创建任何额外的对象实体即可生效[^4]。 ```java try { System.out.println("Going to sleep..."); Thread.sleep(2000L); System.out.println("Awake now!"); } catch (InterruptedException e) { e.printStackTrace(); } ``` 综上所述,虽然各个平台上的实现细节有所区别但是基本原理都是相似的——即强制某一部分计算资源在一个较短时间内处于闲置模式从而达到同步协调的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无霸哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值