• 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);

  • 相关阅读:
    SQL去除重复记录
    FullCalendar应用——整合农历节气和节日
    Dropzone.js实现文件拖拽上传
    HTML5实现文件断点续传
    FullCalendar日历插件说明文档
    网络电影免会员播放器
    百度网盘搜索工具
    HTML5学习
    HTML2 -- 布局格式
    JS10 -- url问号后的数据
  • 原文地址:https://www.cnblogs.com/buzhidaojiaoshenme/p/6831665.html
Copyright © 2020-2023  润新知