sleep(0)、sleep(1)与sleep(1000)函数是不是很迷?!

        随着计算机科学和软件开发的飞速发展,开发者们常常需要在程序中引入一些时间控制的手段。其中,sleep函数成为了一种常见的工具,用于控制程序的执行速度、等待异步操作完成或者调度多线程任务。在这篇博客中,我们将深入研究三种睡眠函数:sleep(0)sleep(1)sleep(1000),并探讨它们之间的区别与应用场景。

sleep函数简介

        在编程中,sleep函数被用来使程序暂停执行一段时间。这段时间可以是毫秒、秒或者更长。sleep函数的调用通常是为了避免程序执行过快,或者等待某些任务完成。

sleep(0):放弃时间片

sleep(0)是一个特殊的情况,它的目的并不是为了让程序真正休眠,而是为了让当前线程主动放弃时间片,让其他等待执行的任务有机会执行。这在多线程或多任务的环境中特别有用,可以提高程序的效率。

sleep(1):短暂的等待

相比之下,sleep(1)就是一个相对较短的休眠时间,通常是1ms。它会在极短的1毫秒内进入睡眠(被放入等待队列中,进入等待状态,暂时放弃CPU竞争),1毫秒后立刻又再次参与CPU的竞争。这种情况常用于需要在执行之间添加短暂延迟的场景,或者等待一些异步操作完成。

sleep(1000):漫长的休眠

sleep(1000)则代表程序将休眠1000毫秒,即一秒钟。这种情况适用于需要较长时间延迟的场景,例如在某些长时间运行的任务之间,或者在特定时间执行某些操作。

需要注意:

提到sleep(0)不得不说Thread.yield()函数

Thread.yeild();也是当前 thread睡觉,让出CPU。(不释放锁)

Thread.sleep(0) 也是thread睡觉,让出CPU

相较之下,yeild()并不是立刻执行,比较温柔:不信看我下面的实测:

   Thread.yield() 方法是一个静态方法,用于提醒调度器当前线程愿意放弃 CPU 资源,让其他具有相同或更高优先级的线程有机会执行。调用 yield() 方法并不保证当前线程会立即停止执行,而只是表示当前线程愿意让出一部分执行时间。

public class Priority {
    private static volatile boolean notStart = true;
    private static volatile boolean notEnd = true;
    public static void main(String[] args) throws Exception {
        List<Job> jobs = new ArrayList<Job>();
        for (int i = 0; i < 10; i++) {
            int priority = i < 5 ?Thread.MIN_PRIORITY : Thread.MAX_PRIORITY;
            Job job = new Job(priority);
            jobs.add(job);
            Thread thread = new Thread(job, "Thread:" + i);
            thread.setPriority(priority);
            thread.start();
        }
        notStart = false;
        TimeUnit.SECONDS.sleep(10);
        notEnd = false;
        for (Job job : jobs) {
            System.out.println("Job Priority : " + job.priority +
                    ",Count : " + job.jobCount);
        }
    }
    static class Job implements Runnable {
        private int priority;
        private long jobCount;
        public Job(int priority) {
            this.priority = priority;
        }
        public void run() {
            while (notStart) {
                Thread.yield();
            }
            while (notEnd) {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                jobCount++;
            }
        }
    }
}

 相较之下,yield()比较生效比较温柔,慢

 

应用场景

  • sleep(0) 在需要平衡多任务执行的场景中,通过放弃时间片来提高整体程序的并发性。

  • sleep(1) 它会在极短的1毫秒内进入睡眠(被放入等待队列中,进入等待状态,暂时放弃CPU竞争),1毫秒后立刻又再次参与CPU的竞争。

  • sleep(1000) 适用于需要相对较长延迟的情况,例如在定时任务中等待一段时间后执行下一步操作。

结语

        sleep函数在编程中扮演着重要的角色,通过合理的使用,我们可以更好地控制程序的执行流程,提高程序的效率和稳定性。

        在选择使用 sleep(0)sleep(1) 还是 sleep(1000) 时,务必根据具体场景和需求进行合理的取舍,以达到最佳的程序性能。

希望通过这篇博客,读者们对这几种睡眠函数的区别有了更清晰的认识。

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五敷有你

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

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

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

打赏作者

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

抵扣说明:

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

余额充值