微信公众号已开通,搜索微信公众号:程序喵星人。点击关注^_^
12.多线程
1.为什么要使用多线程
1.可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。
2.可以使用线程来简化编码。
3.可以使用线程来实现并发执行。
2.线程相关知识点
基本知识
1.线程与进程:进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。
2.前台线程和后台线程:通过Thread类新建线程默认为前台线程。当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常。
3.挂起(Suspend)和唤醒(Resume):由于线程的执行顺序和程序的执行情况不可预知,所以使用挂起和唤醒容易发生死锁的情况,在实际应用中应该尽量少用。
4.阻塞线程:Join,阻塞调用线程,直到该线程终止。
5.终止线程:Abort:抛出ThreadAbortException异常让线程终止,终止后的线程不可唤醒。Interrupt:抛出ThreadInterruptException异常让线程终止,通过捕获异常可以继续执行。
6.线程优先级:AboveNormal BelowNormal Highest Lowest Normal,默认为Normal。
3.使用线程开发
1.Thread类的使用
使用Thread类可以创建和控制线程。在创建Thread对象后,就可以用Start方法启动线程。
2.给线程传递数据
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; // 引入线程的命名空间 // 线程 namespace Lesson_42_1 { class Program { static void Main(string[] args) { // ThreadStart 所定义的是不带参的委托 Thread t1 = new Thread(new ThreadStart(test1)); t1.Name = "线程1"; t1.Start(); // t1.IsBackground = true; //线程在后台执行。放开代码后,test1执行结果不会输出到窗口。 // ParameterizedThreadStart 定义的是带参的委托 Thread t2 = new Thread(new ParameterizedThreadStart(test2)); t2.Name = "线程2"; t2.Priority = ThreadPriority.Highest; // 线程优先级 t2.Start("hello"); } static void test1() { // Console.WriteLine("线程停止2秒执行"); // Thread.Sleep(2000); // 线程的休眠 Console.WriteLine("此线程在此处阻塞2秒"); Thread.CurrentThread.Join(2000); Console.WriteLine("当前线程的执行名字:" + Thread.CurrentThread.Name); Console.WriteLine("这是线程1所执行的方法"); } static void test2(object s) { Console.WriteLine("当前线程的执行名字:" + Thread.CurrentThread.Name); Console.WriteLine("这是线程2所执行的方法,s = " + s); } } }