zoukankan      html  css  js  c++  java
  • 线程的使用

    单线程

    单线程,就是只有一个线程。系统为应用程序分配一个主线程,该线程执行程序中以Main方法开始和结束的代码。

    多线程

    1.多线程的优点:要提高对用户的响应速度并且处理所需数据,以便几乎同时完成工作。

    单个应用程序域可以使用多线程完成以下任务:

    1).通过网络与Web服务器和数据库进行通信。

    2).执行占用大量时间操作。

    3).区分具有不同优先级的任务。

    4).使用户界面可以在将时间分配给后台任务时仍能快速做出响应。

    2.多线程的缺点

    增加操作系统资源的使用,降低性能。

    使用多线程,可能会产生如下问题:

    1).系统将为进程、AppDomain对象和线程所需的上下文信息使用内存。因此,可以创建的进程、AppDomain对象和线程的数目会受到可用内存的限制。

    2).跟踪大量的线程将占用大量的处理器时间。如果线程过多,则其中大多数线程都不会产生明显的进度。如果大多数当前线程处于一个进程中,则其他进程中的线程的调度频率就会很低。

    3).使用许多线程控制代码执行非常复杂,并且可能产生许多bug。

    4).销毁线程需要了解可能发生的问题并对这些问题进行处理。

    3.Thread类

    Thread类主要用于创建并控制线程、设置线程优先级并获取其状态。

    1).Thread类的常用属性及说明

    ApartmentState:获取或设置该线程的单元状态

    CurrentContext:获取线程正在其中执行的当前上下文

    CurrentThread:获取当前正在运行的线程

    IsAlive:获取当前线程的执行状态

    ManagedThreadId:获取当前托管线程的唯一标识符

    Name:获取或设置线程的名称

    Priority:获取线程的调度优先级

    ThreadState:获取当前线程的状态

    2).Thread类的常用方法及说明

    Abort:终止线程

    GetApartmentState:返回一个ApartmentState值,指示单元状态。

    GetDomain:返回当前线程正在其中运行的当前域

    Interrupt:中断处于WaitSleepJoin线程状态的线程

    Join:阻止调用线程,直到某个线程终止时为止

    ResetAbort:取消为当前线程请求的Abort

    Resume:继续已挂起的线程

    SetApartmentState:在线程启动前是指其单元状态

    Sleep:将当前线程阻止指定的毫秒数

    SpinWait:导致线程等待由iterations参数定义的时间量

    Start:使线程被安排进行执行

    Suspent:挂起线程,或者如果线程已挂起,则不起作用

    VolatileRead:读取字段值。

    VolatileWrite:立即向字段写入一个值。

    3).创建线程

    static void Main(string [] args)

    {

    Thread myThread = new Thread(new ThreadStart(CreateThread));

    myThread.Start();

    }

    public static void CreateThread()

    {

    Console.Write(“创建线程”);

    }

    4).线程的挂起与恢复

    static void Main(string [] args)

    {

    Thread myThread = new Thread(new ThreadStart(CreateThread));

    myThread.Start();

    myThread.Suspend();       //挂起线程

    myThread.Resume();       //恢复挂起线程

    }

    public static void CreateThread()

    {

    Console.Write(“线程实例”);

    }

    5).线程休眠

    将当前线程阻止指定的时间。

    a).public static void Sleep(int millSecondsTimeout)

    b).public static void Sleep(TimeSpan timeout)

    6).终止线程

    a).Abort方法

    线程的Abrot方法用于永久地停止托管线程。

    static void Main(string [] args)

    {

    Thread myThread = new Thread(new ThreadStart(CreateThread));

    myThread.Start();

    myThread.Abort();  //终止线程

    }

    public static void CreateThread()

    {

    Console.Write(“线程实例”);

    }

    b).Join方法

    Join方法用来阻止调用线程,直到某个线程终止为止。

    static void Main(string [] args)

    {

    Thread myThread = new Thread(new ThreadStart(CreateThread));

    myThread.Start();

    myThread.Join();      //

    }

    public static void CreateThread()

    {

    Console.Write(“线程实例”);

    }

    7).线程优先级

    线程的优先级值:AbroveNormal,BlowNormal,Highest,Lowest,Normal

    static void Main(string[] args)

    {

    Thread thread1 = new Thread(new ThreadStart(Thread1));

    thread1.Priority = ThreadPriority.Lowest;

    Thread thread2 = new Thread(new ThreadStart(Thread2));

    thread1.Start();

    thread2.Start();

    }

    Static void Thread1()

    {

    Console.WriteLine(“线程一”);

    }

    Static void Thread2()

    {

    Console.WriteLine(“线程二”);

    }

    8).线程同步

    线程同步时指并发线程高效、有序地访问共享资源所采用的技术,所谓同步,是指某一时刻只有一个线程可以访问资源,只有当资源所有者主动放弃了代码或资源的所有权时,其他线程才可以使用这些资源。

    a).使用C#中lock关键字实现线程同步

    statci void Main(string[] args)

    {

    Program myProgram = new Program();

    myProgram.LockThread();

    }

    void LockThread()

    {

    lock(this)

    {

    Console.WriteLine(“锁定线程以实现线程同步”);

    }

    }

    b).使用Monitor类实现线程同步

    Monitor类提供了同步对象的访问机制,它通过向单个线程授予对象锁来控制对对象的访问,对象锁提供限制访问代码块的能力。当一个线程拥有对象锁时,其他任何线程都不能获取该锁。

    Monitor类的常用方法及说明

    Enter:在指定对象上获取排他锁

    Exit:释放指定对象上的排他锁

    Pulse:通知等待队列上的线程锁定对象状态的更改

    PulseAll:通知所有的等待线程对象状态的更改

    TryEnter:试图获取指定对象的排他锁

    Wait:释放对象上的锁并阻止当前的线程,直到它重新获取该锁

    statci void Main(string[] args)

    {

    Program myProgram = new Program();

    myProgram.LockThread();

    }

    void LockThread()

    {

    Monitor.Enter(this);//锁定当前线程

    Console.WriteLine(“锁定线程以实现线程同步”);

    Monitor.Exit(this);//释放当前线程

    }

    c).使用Mutex类实现线程同步

    statci void Main(string[] args)

    {

    Program myProgram = new Program();

    myProgram.LockThread();

    }

    void LockThread()

    {

    Mutex myMutex = new Mutex(false);

    myMutex.WaitOne();//阻止当前线程

    Console.WriteLine(“锁定线程以实现线程同步”);

    myMutex.ReleaseMutex();//释放Mutex对象

    }

    《C#从入门到精通》读后总结

  • 相关阅读:
    SharePoint中获取当前登录的用户名
    SharePoint 2013 图文开发系列之InfoPath入门
    在InfoPath中如何获取当前用户的信息(Profile)
    更新当前列并添加其他列
    poj3067 Japan
    poj2481 Cows
    poj1195 Mobile phones
    poj2299 Ultra-QuickSort
    lower_bound()和upper_bound
    hdu4339 Query
  • 原文地址:https://www.cnblogs.com/hmliang/p/5400904.html
Copyright © 2011-2022 走看看