线程基础--读多线程编程实战—(1)

本文介绍了多线程编程的关键概念,包括如何使用Thread类创建线程、线程的并行执行、通过Thread.Sleep()暂停线程、使用Join()方法进行线程等待、不推荐的线程终止方式Abort()以及线程状态检测。示例代码展示了线程的同步和控制方法,强调了安全终止线程的重要性。
摘要由CSDN通过智能技术生成

目前我们使用的电脑都是多核处理器,讨论并行执行才有意义,之前的单核是的并行任务实际是操作系统的分时实现。

 > 创建线程

使用Thread类

            Thread th = new Thread(PrintNumber); //创建一个独立线程
            th.Start(); //开始执行线程 

           PrintNumber();

 

创建线程委托的方法

        static void PrintNumber()
        {
            Console.WriteLine("Starting......");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(10);
            }
        }

输出:

主线程和创建的线程同时执行了打印任务,可以看出任务在并行执行。

> 暂停线程

Thread.Sleep()方法 使线程处于休眠状态,它会占尽可以能的CPU时间。

        static void PrintNumberWithDelay()
        {
            Console.WriteLine("Starting with delay.....");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(TimeSpan.FromMilliseconds(200));
            }
        }

创建新线程执行:

            Thread th = new Thread(PrintNumberWithDelay);
            th.Start();
            PrintNumber();

输出:

新线程每打印一个数字会休眠0.2秒,所以主线程中代码会比独立线程中的方法先执行。

> 线程等待

让程序等待一个线程中的计算完成,然后在代码中使用该线程的计算结果。线程调用 join() 方法

        private static int sum { get; set; }
        static void checkSum()
        {
            for (int i = 0; i <= 100; i++)
            {
                sum += i;
                Thread.Sleep(10);
            }
        }

            Thread th = new Thread(checkSum);
            th.Start();
            th.Join();//等待线程的完成
            Console.WriteLine(sum);

输出:

线程等待是处在阻塞状态的。

> 线程终止

调用Abort方法

            Thread t1 = new Thread(PrintNumberWithDelay);
            t1.Start();
            Thread.Sleep(1000);
            t1.Abort();//终止线程
            Console.WriteLine("t1 thread has been aborts!");
            Thread t2 = new Thread(PrintNumber);
            t2.Start();
            PrintNumber();

输出:

不推荐使用Abort方法来终止线程,该技术不一定总能终止线程,该方法实际是给线程注入ThreadAbortException方法,导致线程被终止,这非常危险,因为该异常可以在任何时刻发送,并有可能彻底摧毁应用程序。建议使用 CancellationToken方法来取消执行的线程。

> 线程状态检测

属性ThreadState

        static void DoNothing()
        {
            Thread.Sleep(2000);
        }

        static void PrintNumbersWithstatus()
        {
            Console.WriteLine(Thread.CurrentThread.ThreadState.ToString());
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(2000);
                Console.WriteLine(i);
            }
        }

 

            Console.WriteLine("Main Thread starting...");
            Thread t1 = new Thread(PrintNumbersWithstatus);
            Thread t2 = new Thread(DoNothing);
            Console.WriteLine(t1.ThreadState.ToString());
            t2.Start();
            t1.Start();
            for (int i = 0; i < 30; i++)
            {
                Console.WriteLine(t1.ThreadState.ToString());
            }

            Thread.Sleep(TimeSpan.FromSeconds(6));
            t1.Abort();
            Console.WriteLine("t1 aborted");
            Console.WriteLine(t1.ThreadState.ToString());
            Console.WriteLine(t2.ThreadState.ToString());

输出:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysh05

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值