线程控制

进程和线程是现代操作系统的重要概念。前者是应用程序的实例,一个正在运行的应用程序在操作中被视为一个进程。为了使多个任务互不干扰的进行,每个进程都拥有独立的虚拟地址空间、代码段、数据段及堆栈等。另外,进程还占了各种系统资源(如文件、窗体对象。环境变量等)。进程拥有自身独立的资源,进程之间相互隔离,互不干扰。

线程是操作系统分配处理器时间的基本单元,他也是一组指令的集合,可以在程序中独立执行,所以有时也被称为轻量级进程或微进程,一个进程可以包含一个或多个线程,线程共享所属进程所拥有的资源,可以访问其所属进程的内存区域和代码段。同时,线程还拥有各自的局部变量与独立的栈空间,所有线程都允许并发的执行,每个进行至少有一个线程来执行它的代码,如果没有线程来执行,系统就会自动撤销该进程和它的地址空间。

通常,当执行一个线程后,该线程会经历一个生命周期,即开始,就绪,运行,休眠,终止状态等。这些状态可以通过线程的ThreadState属性来获取。

用一个例子来学习一下如何控制线程:要求当计数器达到4,8时,第一个线程进行休眠状态,第二个线程一旦检查到第一个线程处于WaitSleepJoin状态,就立即中断第一个线程,将其放回队列中。

运行结果:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Test1_1
{
    class HelloWorld
    {
        public static Thread sleeper;
        public static Thread awaker;

        public void SleepThread()
        {
            for (int i = 1; i < 10; ++i)
            {
                Console.Write(i + ",");
                if (i == 4 || i == 8)
                {
                    Console.WriteLine("thread is sleep at " + i);
                    try
                    {
                        Thread.Sleep(20);                               //暂停线程
                    }
                    catch (ThreadInterruptedException ex)               //捕获中断异常
                    {
                        Console.WriteLine("thread is interrupted");
                    }
                }
                    
            }
        }

        public void AwakerThread()
        {
            for (char ch = 'A'; ch < 'K'; ++ch)
            {
                Console.Write(ch + ",");
                if (sleeper.ThreadState == ThreadState.WaitSleepJoin)
                {
                    Console.WriteLine("thread is awake at " + ch);
                    sleeper.Interrupt();                                //中断线程
                }       
            }
        }

        static void Main(string[] args)
        {
            HelloWorld mi = new HelloWorld();
            sleeper = new Thread(new ThreadStart(mi.SleepThread));      //创建第一个线程
            awaker = new Thread(new ThreadStart(mi.AwakerThread));      //创建第二个线程

            sleeper.Start();                                            //启动第一个线程
            awaker.Start();                                             //启动第二个线程

            Console.Read();
        }
    }
}

Thread.sleep:立即将当前线程暂停一段时间,以便操作系统处理其他线程。

Thread.Interrupt()会中断处于休眠的线程,将其重新放回调度队列中,会在目标线程引发ThreadInterruptedException异常。应该捕获该异常,以便执行适当操作后继续运行该线程。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值