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有啥区别的主要内容,如果未能解决你的问题,请参考以下文章