线程如何启动的,resumethread( 二 )


线程如何启动的,resumethread


谢谢邀请!早期的jdk版本中提供了退出的方法:hread.stop, Thread.suspend, Thread.resume和Runtime.runFinalizersOnExit ,因为操作不安全,可能会出现不可控的结果,已不推荐使用 。在回答之前咱们先看下线程的几个状态和状态切换的过程,如下图(不想画了,网上盗图):线程退出肯定是初始化后的任何一个状态(不包含终止态)退出 。
线程启动后是独立运行的,正常来说启动后是无法干预运行的,只能等其正在运行结束,如果想要干预,只能在共享内存区加状态标识,其实jdk已经内置了一个状态标识就是中断标识,调用中断方法,但是waiting状态的线程会抛出中断异常,自己可以再优化下加共享状态变量 。总结一下有三种方法:1、等线程自己执行完结束(这种最优雅,但是也没有讨论的意义了) 。
2、调用中断方法,判断中断标识 。但是waiting状态下会抛异常,不能算作优雅,示例代码如下:3、自己加中断状态标识,示例代码如下:总结下:waiting状态:此状态下退出只能调用中断方法 。blocked状态:分两种,一种可中断,调用中断方法退出;一种不可中断,只能等running后退出 。ready状态:等cpu调度,不可干预 。
C语言中Thread与Task有什么区别?
线程如何启动的,resumethread


Thread是C#中最早的多线程模型,后来才推出的Task 。微软推出Task的目的,就是要替代Thread,给程序员们提供一种更科学的线程模型 。ThreadThread是基于delegate的早期线程模型 。固定参数的delegate支持线程的常规操作,如Start,Join,Abort,Interrupt,Suspend,Resume等等 。
使用Thread可以完成大部分的常规线程操作 。虽然Thread不如Task强大,但是Thread也有一个使用得非常广泛的API:Thread.Sleep尽管设计得好的多线程程序,完全不需要显式地Sleep!另外,刚才用.Net Framework 4.7.2 创建了一个项目,看了看Thred的API,居然也支持了Yield:Thread.Yield更有ResetAbort这种操作:Thread.ResetAbort真是不用Thread久已!TaskTask是基于Action,Func的更加现代的线程模型 。
支持模板参数,比Thread中的固定参数delegate,在进行数据传递的时候,要更加灵活 。基于ActionTask采用了和ThreadPool类似的调度策略,但是Task在多核心CPU中在表现,要比ThreadPool更好 。在单核心CPU上执行的时候,Thread和Task基本没有太大区别 。Task在线程的控制方面,有更加强大的API支持:Task通过CancellationToken支持一种线程的取消机制Task支持Delay操作Task提供了更完善的异常处理机制Task自带线程工厂,方便随时创建TaskTask支持Wait WaitAny WaitAllTask支持WhenAny WhenAllTask支持ContinueWith,节省线程开销Task支持Yield操作Task通过TaskScheduler可以支持线程队列Task还可以配合 async 和 await 关键字,写出更优雅的多线程程序,用过的人才知道有多香! 。
【线程如何启动的,resumethread】 。。。。。总之,Task是更加现代的线程管理模型,推荐优先使用Task 。后续我将专门写一批C#中线程相关的文章,欢迎关注:《C#中多线程的那点事儿-Thread入门》《C#中多线程的那点事-多线程的代价》《C#中多线程的那点事-线程池》《C#中多线程的那点事-锁》《C#中多线程的那点事-死锁》 。。。

推荐阅读