dotNet线程的应用(一)

2016-05-13  本文已影响0人  qratosone

基础知识:

线程与线程对象

多线程程序在忙于处理数据的时候仍然能响应用户操作。
线程是操作系统分配CPU的基本单元,操作系统会使用调度算法把多个线程分给多个核心来执行
程序可以把分割出来的工作封装成一个函数,由线程负责执行
每一个线程一定对应着一个线程函数,线程的运行过程与线程函数执行过程一一对应
Public Thread(ThreadStart start);
线程函数的要求:必须要返回void
Thread th1=new Thread(func);
线程对象创建之后调用Start方法开始,代码执行完毕之后线程结束
程序启动的第一个线程称为主线程,主线程会负责启动其他的线程
在线程函数中使用Thread.CurrentThread可以获取负责执行此函数的线程对象引用
每个线程都有一个ID,线程对象的ManagedThreadID属性保存了这个值
线程暂停——Thread.Sleep(Time);
Thread.SpinSleep(Time)可以让CPU空转,但是线程状态不改变
Abort方法可以提前终止线程——注意,需要加上异常捕获结构,捕获ThreadAbout异常,Thread.ResetAbort();
实际开发中一般不用Abort提前终止线程


背景线程
IsBackground属性:
当主线程结束的时候,背景线程自动终止
默认创建的都是前台线程,CLR会等到所有前台线程都结束的时候才会结束整个进程

Thread类的Join方法可以让一个线程等待另一个线程结束(线程同步)
Th.Start();
Th.Join();
相当于把B的流程“嵌入”到A里
注意如果使用不当容易造成死锁
dotNet的线程属于“托管线程”,由CLR进行调度(操作系统直接调度的线程称为物理线程)
dotNet提供的线程状态比操作系统线程状态多
辅助线程状态切换:
Unstart
Running
Stopped


代码演示

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

namespace Chap4_1_Thread
{
    public class MyClass
    {
        public static void StaticMethod()
        {
            Console.WriteLine("线程{0}执行MyClass.StaticMethod", Thread.CurrentThread.ManagedThreadId);
        }
        public void InstanceMethod()
        {
            Console.WriteLine("线程{0}执行MyClass.InstanceMethod", Thread.CurrentThread.ManagedThreadId);
        }
    }
    class Program
    {
        static void ThreadAMethod()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("辅助线程正在执行:" + i.ToString());
                Thread.Sleep(200);
            }
            Console.WriteLine("辅助线程执行结束");
        }
        static void Main(string[] args)
        {
            Console.WriteLine("main thread ID:{0}", Thread.CurrentThread.ManagedThreadId);
            MyClass obj = new MyClass();
            Thread th1 = new Thread(new ThreadStart(MyClass.StaticMethod));
            Thread th2 = new Thread(new ThreadStart(obj.InstanceMethod));
            //ThreadStart是一个委托
            Thread th3 = new Thread(MyClass.StaticMethod);
            //简化写法
            th1.Start();
            th2.Start();
            th3.Start();
            //用Start方法开始执行线程
            Console.WriteLine("主线程{0}任务执行完毕,敲任意键退出", Thread.CurrentThread.ManagedThreadId);
            Console.ReadKey();
            //以下为线程的睡眠
            Thread sleeper = new Thread(()=>{
                for (int i = 0; i <10; i++)
                {
                    Thread.Sleep(100);
                    Console.WriteLine("第{0}次睡眠", i);
                }
            });
            sleeper.Start();
            Console.WriteLine("睡眠结束");//注意主线程和sleeper是并行运行的
            Console.ReadKey();
            //使用join方法让主线程等待子线程
            Console.WriteLine("join方法演示");
            Thread waiting = new Thread(ThreadAMethod);
            waiting.Start();
            waiting.Join();
            Console.WriteLine("主线程结束");
            Console.ReadKey();
            //线程状态

            Console.WriteLine("显示线程状态");
            Thread status = new Thread(() =>
            {
                Console.WriteLine(Thread.CurrentThread.ThreadState);
            });
            Console.WriteLine(status.ThreadState);
            status.Start();
            status.Join();
            Console.WriteLine(status.ThreadState);
            Console.ReadKey();
        }
    }
}

上一篇 下一篇

猜你喜欢

热点阅读