C#线程

线程


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

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

  多线程可以提高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;
    }
}

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MFC多线程

    拾点阳光
  • 聊天机器人一

    拾点阳光
  • c++ 深入理解虚函数

    拾点阳光
  • 高性能解决线程饥饿的利器 StampedLock

    在 JDK 1.8 引入 StampedLock,可以理解为对 ReentrantReadWriteLock 在某些方面的增强,在原先读写锁的基础上新增了一种叫...

    码哥字节
  • synchronized与Lock的区别与使用详解

    昨天在学习别人分享的面试经验时,看到Lock的使用。想起自己在上次面试也遇到了synchronized与Lock的区别与使用。于是,我整理了两者的区别和使用情况...

    Java团长
  • 跟面试官讲解CountDownLatch源码设计原理

    一种同步辅助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。 CountDownLatch 是用给定的 count 初始化的。由于调用了coun...

    JavaEdge
  • Java 中的锁原理、锁优化、CAS、AQS 详解!

    结论:如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

    Java团长
  • Java并发技术总结之二——ThreadLocal

    ThreadLocal 用来保证规避多线程访问线程不安全的情况,每个线程访问自己的副本变量,这样就避免了对资源的抢占导致数据不一致的问题。

    剑影啸清寒
  • Java 中的锁原理、锁优化、CAS、AQS 详解!

    结论:如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

    芋道源码
  • 你必须要知道的锁原理、锁优化、CAS、AQS

    出处:https://www.jianshu.com/p/e674ee68fd3f

    好好学java

扫码关注云+社区

领取腾讯云代金券