zoukankan      html  css  js  c++  java
  • 线程 终止

    线程终止和线程启动一样,并不是即时模式。

    类似于使用 Thread.Abor();去终止线程,如果 Thread未执行完线程内的非托管代码时,是不会出现ThreadAborException。但是当Thread 执行到CLR的时候,才会抛出异常。

    线程终止机制:如果线程需要终止,Thread位开发者提供了接口:Cancled。线程在工作时,还会以某种频率检测Cancled,当检测到Cancled 时 线程会自动停止。

    FCL(Framework class library 即类库)为我们提供了标准的取消模式:协作取消模式(Cooperative Cancelletion),下面是简单的使用实例

            CancellationTokenSource cancel = new CancellationTokenSource();            
           Thread t = new Thread(() =>
                {
                    while (true)
                    {
                        //检测到停止标识
                        if (cancel.IsCancellationRequested)
                        {
                            Console.WriteLine("线程已停止" + DateTime.Now);
                            break;
                        }
                        Console.WriteLine(DateTime.Now);
                        Thread.Sleep(1000);
                    }
                });
                //t.Priority = ThreadPriority.Highest;
                t.IsBackground = true;
                t.Start();
                cancel.Cancel();
                Console.WriteLine("线程已启动" + DateTime.Now);

    调用者通过CancellationTokenSource的 Cancel() 通知工作线程退出。而线程则以 每1000ms的频率去检测Cancel的取消标识。

    协议式终止线程中使用的关键类 CancellationTokenSource。 其中它有一个属性 Token 提供了IsCancellationRequested 标识来判断是否停止线程。它还有一个回调方法需要注意Register();

                cancel.Token.Register(()=> {
                    Console.WriteLine("线程终止回调函数" + DateTime.Now);
                });
  • 相关阅读:
    spring mvc + kafka实战
    springboot 实现文件下载功能
    vue前端文件下载
    父类和子类初始化顺序
    几种单例模式
    全链路压测注意点
    压力测试-ab
    压力测试-locust讲解
    Java httpClient 中get, post ,put(form-data & raw), delete方法使用
    RequestBody 和RequestEntity使用
  • 原文地址:https://www.cnblogs.com/scyr/p/7339634.html
Copyright © 2011-2022 走看看