Thread

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

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。

前台线程:只有所有的前台线程都关闭才能完成程序关闭。

后台线程:只要所有的前台线程结束,后台线程自动结束。(IsBackground属性设置线程为后台线程)

//带参

ParameterizedThreadStart para=new ParameterizedThreadStart(test);

Thread threadParame=new Thread(para);

threadParame.Start(new string[]{"00","11"});

void test(object aa)

{

string[] arr=(string[])aa;

Console.WriteLine("{0} {1}",arr[0],arr[1]);

}

Thread.Start():启动线程的执行

Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用

Thread.Resume():继续已挂起的线程

Thread.Interrupt():终止处于Wait或者Sleep或Joiin线程状态的线程

Thread.Join():阻塞调用线程,直到某个线程终止时为止

Thread.Sleep():将当前线程阻塞指定的毫秒数

Thread.Abort():以开始终止此线程的过程。如果线程已经在终止,则不能通过Thread.Start()来启动。

通过调用Thread.Sleep,Thread.Suspend或者Thread.Join可以暂停/阻塞线程。Sleep使得线程立即停止执行,但在调用Suspend()方法前,公共语言运行时必须到达一个安全点。一个线程不能对另外一个线程调用sleep,但是可以调用suspend使得另外一个线程暂停执行。对已经挂起的线程resume方法会使其继续执行。只有当该线程是被其他线程通过调用Interrupt或abort才能被唤醒。如果对处理阻塞状态的线程调用Interrupt将使线程状态改变,但会抛出异常。在一定等待时间内,Interrupt和abort都可以立即唤醒一个线程。

abort使得系统销毁线程(但不是立即销毁)而不通知用户。一旦实施abort该线程不能被重新启动。join是一个阻塞调用,直到线程的确是终止了才返回。

非抢占式调度:指某个线程在运行时不会被操作系统强制暂停,它可以持续地运行直至运行告一段落并主动地交出运行权。在这样的调度模式下,线程的运行就完全是单队列的,并且可能产生恶意程序长期霸占运行权的情况。而且一旦一个程序死了,那么整个电脑就只好重启了。

抢占式调度:指每个线程都只有极少的运行时间,当时间用完时该线程就会被强制暂停,保存上下文并把cpu运行权交给下一个线程,这样调度的结果就是所有的线程都在被快速地切换运行。

//线程池
class TaskInfo

{

public RegisteredWaitHandle Handle=null;

public string OtherInfo="dd";

}

void WaitProc(Object state,bool timedOut)

{

TaskInfo ti=(TaskInfo)state;

string cause="time out";

if(!timedOut)

{

cause="signaled";

if(ti.Handle!=null)

{

ti.Handle.Unregister(null);

}

}

Console.WriteLine("WaitProc({0}) on thread {1}; cause={2} ",ti.OtherInfo,Thread.CurrentThread.GetHashCode().ToString(),cause);

}

 //使用RegisterWaitForSingleObject方法将任务排队,以由ThreadPool线程执行。

AutoResetEvent ev=new AutoResetEvent(false);

TaskInfo ti=new TaskInfo();

ti.OtherInfo="first";

//任务RegisterWaitForSingleObject的注册等待句柄

ti.Handle=ThreadPool.RegisterWaitForSingleObject(ev,new WaitOrTimerCallBack(WaitProc),ti,1000,false);

Thread.Sleep(3000);

Console.WriteLine("主线程signals");

//通知等待的线程继续执行

ev.Set();

Thread.Sleep(1000);

原文地址:https://www.cnblogs.com/buzhidaojiaoshenme/p/6831665.html