前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#线程

C#线程

作者头像
拾点阳光
发布2018-05-10 18:07:43
8250
发布2018-05-10 18:07:43
举报
文章被收录于专栏:码云1024码云1024码云1024

线程


  线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

  多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

  多线程可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

  在 C# 中,System.Threading.Thread 类用于线程的工作。线程生命周期开始于System.Threading.Thread 类的对象被创建时,结束于线程被终止或完成执行时。

  我们在编写线程程序时首先要引入System.Threading空间。

创建线程


  当 C# 程序开始执行时,主线程自动创建。使用 Thread 类创建的线程被主线程的子线程调用。通过Start()方法来启动线程。如下面例子:

using System;
using System.Threading;
namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main start");
            /*=========================================/
            Thread 类拥用4个重载的构造函数,常用的一个接收一个ThreadStart类型的参数
            public Thread ( ThreadStart start)
            ThreadStart是一个委托,定义如下
            public delegate void ThreadStart()
            /=========================================*/
            Thread th = new Thread(new ThreadStart(ThreadMethod));
            //也可简写为new Thread(ThreadMethod);
            th.Start(); //启动线程
            for (char i = 'a'; i < 'k'; i++)
            {
                Console.WriteLine("Main Thread: {0}", i);
                Thread.Sleep(100);
            }
            th.Join(); //主线程等待辅助线程结束
            Console.WriteLine("Main Thread end.");
        }
        static void ThreadMethod()
        {
            Console.WriteLine("Second Thread start...");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Second Thread:{0}", i);
                Thread.Sleep(200);
            }
            Console.WriteLine("Second Thread end.");
        }
    }
}

后台线程


  在默认情况下,用Thread类创建的线程是前台线程。在用thread类创建线程时,可以设置IsBackground属性,以确定该线程是前台线程还是后台线程。将线程的IsBackgrond属性设置为false(默认值) 。

  程序运行结果为:

  当我们将IsBackground属性值改为true时,有时可以看到与上面相同的运行结果——新线程的启动消息,但没有结束消息。去试一试吧,后台线程特别适合于完成后台任务,如关闭word等。

控制线程


  C#的Thread类为我们提供了几个重要的方法来控制线程:

  Start():启动线程;

  Sleep(int):静态方法,暂停当前线程指定的毫秒数;

  Abort():通常使用该方法来终止一个线程;

  Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复;

  Resume():恢复被Suspend()方法挂起的线程的执行。

  例如在前面中我们已经使用了Sleep函数。

线程的优先级


  当线程之间争夺CPU时间时,CPU 是按照线程的优先级给予服务的。在C#应用程序中,用户可以设定5个不同的优先级,由高到低分别是Highest,AboveNormal,Normal,BelowNormal,Lowest,在创建线程时如果不指定优先级,那么系统默认为ThreadPriority.Normal。

  给一个线程指定优先级,我们可以使用如下代码:

Thread myThread = new Thread(ThreadMethod); //声明线程
myThread.Priority=ThreadPriority.Lowest; //设定优先级为最低

lock


  当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待。但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候,我们要使该资源在同一时刻只能被一个线程操作,以确保每个操作都是有效即时的,也即保证其操作的原子性。lock是C#中最常用的同步方式,格式为:lock(objectA){codeB} 。

using System;
using System.Threading;
namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            threda t = new threda();
            threda.obj.i = 10;
            Thread th1 = new Thread(new ThreadStart(t.hhh));
            th1.Name = "th1";
            th1.Start();

            Thread th2 = new Thread(new ThreadStart(t.hhh));
            th2.Name = "th2";
            th2.Start();
            Console.ReadKey();
        }
    }
    class threda
    {
        public static sss obj = new sss();

        public void hhh()
        {
            lock (obj) //lock锁
            {
                for (int i = 0; i < 7; i++)
                {
                    Thread.Sleep(500);

                    if (obj.i > 0)
                    {
                        obj.i--;
                        Console.WriteLine("Current Thread Name: " + Thread.CurrentThread.Name + ", obj.i= " + obj.i);
                    }
                }
            }
        }
    }

    class sss
    {
        public int i;
    }
}

  通过设定线程的优先级,我们可以安排一些相对重要的线程优先执行,例如对用户的响应等等。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-08-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 线程
  • 创建线程
  • 后台线程
  • 控制线程
  • 线程的优先级
  • lock
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档