C#线程简介
theme: cyanosis highlight: a11y-dark
这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
线程:
对于所有需要等待的操作,例如移动文件,数据库和网络访问都需要一定的时间,此时就可以启动一个新的线程,同时完成其他任务。一个进程的多个线程可以同时运行在不同的CPU上或多核CPU的不同内核上。 线程是程序中独立的指令流。在VS编辑器中输入代码的时候,系统会分析代码,用下划线标注遗漏的分号和其他语法错误,这就是用一个后台线程完成。Word文档需要一个线程等待用户输入,另一个线程进行后台搜索,第三个线程将写入的数据存储在临时文件中。运行在服务器上的应用程序中等待客户请求的线程成为侦听器线程。 进程包含资源,如Window句柄,文件系统句柄或其他内核对象。每个进程都分配的虚拟内存。一个进程至少包含一个线程。 一个应用程序启动,一般会启动一个进程,然后进程启动多个线程。
线程的优先级:
线程有操作系统调度,一个CPU同一时间只能做一件事情(运行一个线程中的计算任务),当有很多线程需要CPU去执行的时候,线程调度器会根据线程的优先级去判断先去执行哪一个线程,如果优先级相同的话,就使用一个循环调度规则,逐个执行每个线程。 在Thead类中,可以设置Priority属性,以影响线程的基本优先级 ,Priority属性是一个ThreadPriority枚举定义的一个值。定义的级别有Highest ,AboveNormal,BelowNormal 和 Lowest。
控制线程
- 获取线程的状态(Running还是Unstarted,,,),当我们通过调用Thread对象的Start方法,可以创建线程,但是调用了Start方法之后,新线程不是马上进入Running状态,而是出于Unstarted状态,只有当操作系统的线程调度器选择了要运行的线程,这个线程的状态才会修改为Running状态。我们使用Thread.Sleep()方法可以让当前线程休眠进入WaitSleepJoin状态。
- 使用Thread对象的Abort()方法可以停止线程。调用这个方法,会在终止要终止的线程中抛出一个ThreadAbortException类型的异常,我们可以try catch这个异常,然后在线程结束前做一些清理的工作。
- 如果需要等待线程的结束,可以调用Thread对象的Join方法,表示把Thread加入进来,停止当前线程,并把它设置为WaitSleepJoin状态,直到加入的线程完成为止。
线程池(默认为后台线程)
创建线程需要时间。 如果有不同的小任务要完成,就可以事先创建许多线程 , 在应完成这些任务时发出请求。 这个线程数最好在需要更多的线程时增加,在需要释放资源时减少。
不需要 自己创建线程池,系统已经有一个ThreadPool类管理线程。 这个类会在需要时增减池中线程的线程数,直到达到最大的线程数。 池中的最大线程数是可配置的。 在双核 CPU中 ,默认设置为1023个工作线程和 1000个 I/o线程。也可以指定在创建线程池时应立即启动的最小线程数,以及线程池中可用的最大线程数。 如果有更多的作业要处理,线程池中线程的个数也到了极限,最新的作业就要排队,且必须等待线程完成其任务。
``` namespace 线程池创建线程 { class Program { static void Main(string[] args) { ThreadPool.QueueUserWorkItem(SmallThread); ThreadPool.QueueUserWorkItem(SmallThread); ThreadPool.QueueUserWorkItem(SmallThread); ThreadPool.QueueUserWorkItem(SmallThread); ThreadPool.QueueUserWorkItem(SmallThread); ThreadPool.QueueUserWorkItem(SmallThread); ThreadPool.QueueUserWorkItem(SmallThread);
Console.Read();
}
static void SmallThread(object filename)
{
Console.WriteLine("线程开始,ID:"+Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
Console.WriteLine("线程结束");
}
}
} ```
使用线程池需要注意的事项:
线程池中的所有线程都是后台线程 。 如果进程的所有前台线程都结束了,所有的后台线程就会停止。 不能把入池的线程改为前台线程 。 不能给入池的线程设置优先级或名称。 入池的线程只能用于时间较短的任务。 如果线程要一直运行(如 Word的拼写检查器线程),就应使用Thread类创建一个线程。
- C#线程简介
- Unity 报错之 InvalidProgramException: Invalid IL code in CC_Ctrl:getFixByPlatForm
- Unity 之 解决2019之后的版本打apk卡到Building Gradle project问题
- Unity 报错之 LuaException: cannot open Scripts: No such file or directory
- Unity 之 使用ShareSDK分享链接分享的却是文字
- Unity 之 UGUI代码生成UI设置为相对位置问题
- Unity 之 动画系统 -- AnimationEvent使用
- Unity 物理系统 -- 刚体简介
- Unity UI系统 -- UGUI之RectTransform简介
- Unity 之 Time类简介及应用
- Unity UI系统 -- NGUI之AtlasMaker
- Unity UI系统 -- NGUI简介
- Unity UI系统 -- UGUI简介
- Unity 之 基础寻路 -- NavMesh简介和使用示例
- 算法提高 11-1实现strcmp函数
- 算法训练 Torry的困惑(基本型)
- Unity 之 三种抽奖示例(跑马灯,转盘,老虎机实例 文中源码)
- 因为一个疏忽差点被老板开除,Unity解决包体过大的问题记录
- 身为程序员还看不懂UML类图? 一文带你零基础学会看UML类图!
- Source Tree 本地分支无法显示问题记录