timeunit的sleep和thread的sleep有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了timeunit的sleep和thread的sleep有啥区别相关的知识,希望对你有一定的参考价值。

没区别,一样的,其内部也是用 Thread.sleep 实现的。

只不过 TimeUnit 可以设置时间单位,可用性比较好一些。

如果要睡觉 1 秒钟的话,就用 TimeUnit.SECONDS.sleep(1);

如果你用 TimeUnit.MILLISECONDS.sleep() 的话,参数就得写 1000
参考技术A sleep的意思是睡眠。
Win8系统之后,微软对Windows系统的关闭方式做了不小的改动,不少用户不知道该选择关机还是睡眠更好。在Win10下这两种方式有何区别,又该如何使用?  
一、Win10关机和睡眠的区别
睡眠后系统把用户当前的所有数据保存在硬盘中,然后关闭所有允许断电节能的硬件,以便节省电。它的突出优点是唤醒速度快,很快就能重进系统。而关机就是彻底关闭电脑电源,但是Win8和Win10的快速启动技术会在此之前,让系统将内存中的数据,保存在硬盘上,以便重新开机是快速调用。
二、Win10关机和睡眠的使用原则
白天使用电脑的时候,选择睡眠方式,晚上人需要休息不再使用电脑的时候,还是选择关机,毕竟更省电也更环保,睡眠状态下也有辐射不是?还需要提醒朋友们的是,睡眠后再唤醒,很容易出问题,特别是笔记本用户,所以长时间不使用电脑还是建议采取关机的方式。
从Win8和Win10在关机方式上的改进,也可以看出微软对用户体验的重视,让用户能根据使用场景选择合适的关机方式,这点还是值得称赞的。
参考技术B TimeUnit 可以设置时间单位,可用性比较好一些。

如果要睡觉 1 秒钟的话,就用 TimeUnit.SECONDS.sleep(1);

如果你用 TimeUnit.MILLISECONDS.sleep() 的话,参数就得写 1000

C#中的Task.Delay()和Thread.Sleep()区别

C#中的Task.Delay()和Thread.Sleep()区别

一、简介

1.Thread.Sleep()是同步延迟,Task.Delay()是异步延迟。
2.Thread.Sleep()会阻塞线程,Task.Delay()不会。
3.Thread.Sleep()不能取消,Task.Delay()可以。
4.Task.Delay()实质创建一个运行给定时间的任务,Thread.Sleep()使当前线程休眠给定时间。
5.反编译Task.Delay(),基本上讲它就是个包裹在任务中的定时器。
6.Task.Delay()和Thread.Sleep()最大的区别是Task.Delay()旨在异步运行,在同步代码中使用Task.Delay()是没有意义的;在异步代码中使用Thread.Sleep()是一个非常糟糕的主意。通常使用await关键字调用Task.Delay()。

二、代码案例

案例一:Thread.Sleep()和Task.Delay()比较

代码:

   static void Main(string[] args)
        {
            //阻塞,出现CPU等待...
            Task.Factory.StartNew(delegate
            {
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ****** Start Sleep()******");
                for (int i = 1; i <=10; i++)
                {
                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "******Sleep******==>" + i);
                    Thread.Sleep(1000);//同步延迟,阻塞一秒
                }
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ******End Sleep()******");
                Console.WriteLine();
            });

            //不阻塞
            Task.Factory.StartNew(() =>
            {
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======StartDelay()======");
                for (int i =1; i <=10; i++)
                {
                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Delay====== ==>" + i);
                    Task.Delay(1000);//异步延迟
                }
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======End Delay()======");
                Console.WriteLine();
            });
            Console.ReadLine();

            Console.ReadKey();
        }

结果:

通过运行结果截图对比看出,Thread.Sleep()是同步延迟,Task.Delay()是异步延迟。

案例二:通过async/await实现Task.Delay()同步

代码:

         //该段代码通过async/awatit实现“同步”Delay
        static void Main(string[] args)
        {
            Task.Factory.StartNew(async () =>
            {
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Start Delay()======");
                for (int i = 1; i <=10; i++)
                {
                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Delay======" + i);
                    await Task.Delay(1000);
                }
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======End Delay()======");
            });
            Console.ReadKey();
        }

结果:

运行结果可以看出,通过async/await实现了Task.Delay()同步

案例三:Task.Delay()取消

代码:

class Program
    {
        #region
        CancellationTokenSource cts = new CancellationTokenSource();
        void PutThreadSleep()
        {
            Thread.Sleep(5000);
        }

        async Task PutTaskDelay()
        {
            try
            {
                await Task.Delay(5000, cts.Token);//需要.net4.5的支持
            }
            catch (TaskCanceledException ex)
            {
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff ==>") + ex.ToString());
            }
        }

        private void ThreadSleep()
        {
            PutThreadSleep();
            Console.WriteLine("Sleep : I am back");
        }

        private async void TaskDelay()
        {
            await PutTaskDelay();
            Console.WriteLine("Delay : I am back");
        }

        private void CancelTaskDelay()
        {
            cts.Cancel();
        }

        #endregion
        
        static void Main(string[] args)
        {
            #region
            Program p = new Program();
            //不可取消
            p.ThreadSleep();
            //可取消
            p.TaskDelay();
            p.CancelTaskDelay();

            #endregion
            Console.ReadKey();
        }
    }

结果:

Task.Delay()取消,抛出异常信息。

三、总结

Task.Delay(),async/await和CancellationTokenSource组合起来使用可以实现可控制的异步延迟。

以上是关于timeunit的sleep和thread的sleep有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

TimeUnit枚举类

Thread.sleep 未运行 [重复]

Java并发----线程sleepyield线程优先级

TimeUnit类常用的方法解析

如何mock timeunit.seconds.sleep

006 线程休眠