C#中的多线程技术

进程是应用程序的运行实例,是应用程序的一次动态执行
一个进程是由多个线程所组成的,线程是程序执行的基本原子单位,一个进程可以由多个线程组成。线程是“进程”中某个单一顺序的控制流。
线程是进程中的一个基本执行流,每个线程都有自己专属的寄存器(程序计数器、栈指针等),代码区共享,不同的线程可以执行同样的函数。
多线程可以实现并行处理,避免了某项任务长时间占用cpu时间。需要注意的是,多线程程序对于效率应该根据任务不同的要求来选择:
如果两个非常活跃的线程为了抢夺对cpu的控制权,在线程切换时会消耗的cpu资源,反而会降低系统的性能。
在线程的相关知识中,Thread类是最重要的一个,所有起步的信息都包含在Thread类中。
Thread类提供了创建并控制线程,设置其优先级并获取其状态的方法。
该类包含在System.Threading命名空间中。如果想在自己的应用程序中使用多线程,就必须包含Thread类,而在使用Thread类之前,
需要使用using System.Threading;将命名空间包含进来。

Thread类中有4个重载的构造函数,使用最为广泛的是:
public Thread(ThreadStart start);
其参数是start,参数类型是System.Threadding ThreadStart,ThreadStart委托,它表示此线程开始执行时要调用的方法。
需要注意的是,在创建线程时,在该线程上执行的方法将通过一个传递给Thread构造函数的ThreadStart委托来表示。
在调用Start方法之前,该线程不会开始执行

demo1:
class ThreadSimple
{
  //静态线程函数
  public static void ThreadMethodExample()
  {
 
  }
}
//此时就可以调用该静态方法了
Thread ThreadSimple=new Thread(ThreadSimple.ThreadMethodExample)

在实际的代码编写时,还可以使用更加简单的线程定义方式:
Thread ThreadSimple=new Thread(new ThreadStart(ThreadMethodExample));
以上两种方式的效果是完全一样的,第二种方式写出的程序更加简洁

在Thread中提供了Start方法,通过调用该方法,就可以启动线程。
启动线程:即新建并启动一个线程的代码:
ThreadSimple.Start();

Thread类有以下较为常用的实例成员:
IsAlive:判断线程是否处于活动状态
Name:线程的名称
Priority:ThreadPriority枚举类型,代表线程的优先级
ThreadState:ThreadState枚举类型,代表线程的状态
Start:启动一个线程
Suspend:挂起一个线程的运行
Resume:继续挂起的线程
Abort:结束一个线程的运行

当线程创建完毕并启动之后,控制线程的工作还有以下几件事需要完成:
线程的优先级:ThreadPriority属性用于设置线程的级别。在枚举类型ThreadPriority中定义了以下成员,分别对应一种线程级别
Normal:普通级别
AboveNormal:高于普通级别
BelowNormal:低于普通级别
Highest:最高级别
Lowest:最低级别
下面的语句将线程的级别设置成了最高:
ThreadSimple.priority=ThreadPriority.Highest;

线程的休眠:休眠线程是让线程进入一定时间的休眠状态,时间一到,线程将继续运行。这可以通过Thread的Sleep方法实现。
Thread类中有两个重载的Sleep方法:
一个带有int类型的参数,指定休眠的毫秒数;Thread.Sleep(10000);//休眠10秒
另一个带有TimeSpan类型的参数,指定休眠的时间段。Thread.Sleep(new TimeSpan(0,0,0,0,10000));//休眠10秒

线程的挂起:和休眠不同,线程的挂起是暂停线程,如果不再启动线程,它将永远保持暂停状态。只有当前运行的线程才可以挂起,
对已经挂起的线程实施挂起操作没有任何效果。
//如果线程的状态是运行
if(NewThread.ThreadState==ThreadState.Running)
{
  //线程挂起
  NewThread.Suspend();
}

线程的继续:挂起的线程可以使用Thread.Resume方法继续运行,对没有挂起的线程使用继续操作将没有任何结果。
//如果线程的状态是挂起
if(NewThread.ThreadState==ThreadState.Suspended)
{
  //线程继续
  NewThread.Resume();
}

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

namespace SubThread
{
    class SubThread
    {
      
        public void SubThreadFunc()
        {
            int i = 0;
            do
            {
                i++;
                Console.WriteLine("子线程正在运行……{0}", i);
            }
            while(1==1);
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("子线程启动、停止、终止、阻塞等");
            //创建ThreadS,演示SubThread类的SubThreadFunc方法
            SubThread sThread = new SubThread();
            Thread threadS = new Thread(new ThreadStart(sThread.SubThreadFunc));
            Console.WriteLine("子线程启动");
            threadS.Start();
            Console.WriteLine("子线程状态---------------{0}",threadS.ThreadState);
           //主线程休眠200毫秒
            Thread.Sleep(200);
            Console.WriteLine("主线程休眠200毫秒");
            //线程终止
            threadS.Abort();
            Console.WriteLine();
            Console.WriteLine("子线程状态-------{0}", threadS.ThreadState);
            Console.WriteLine("子线程终止");
            Console.WriteLine("sThread.SubThreadFunc()被终止");

            try
            {
                threadS.Start();
                Console.WriteLine("尝试启动sThread.SubThreadFunc()");
            }
            catch (ThreadStateException)
            {
                Console.WriteLine("sThread.SubThreadFunc()已经终止线程,不能被重新启动");
                Console.WriteLine("子线程状态-------{0}", threadS.ThreadState);
                Console.ReadKey();
            }
            return;

        }
    }
}

效果:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值