zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    Spring Boot应用的启动和停止(Spring Boot应用通过start命令启动)
    MySQL注释(转)
    MySQL命令行自动补全表名
    Linux后台运行命令nohub输出pid到文件(转)
    Spring Boot使用MyBatis 3打印SQL的配置
    MySQL常用的七种表类型(转)
    spring-boot-starter-data-redis与spring-boot-starter-redis两个包的区别
    Eclipse的JQuery提示插件-Spket(别试了,没什么效果,且安装设置麻烦)
    MySQL中的数据类型的长度范围和显示宽度(转)
    MySql基本数据类型(转)
  • 原文地址:https://www.cnblogs.com/buzhidaojiaoshenme/p/6831665.html
Copyright © 2011-2022 走看看