zoukankan      html  css  js  c++  java
  • 解决Thread 的关闭问题

     1public class BX_Thread
     2    {
     3        private Thread thWorker;
     4        private bool IsClosing =false;
     5
     6        private int Interval =0;
     7        private object objParameter;
     8        public BX_Thread(object Parameter)
     9        {
    10            this.objParameter =Parameter;
    11            this.thWorker =new Thread(new ThreadStart(WorkProc));
    12            this.thWorker.Priority =ThreadPriority.Lowest;
    13        }

    14
    15        public void Run(int Interval)
    16        {
    17            this.thWorker.Start();
    18        }

    19
    20        private void WorkProc()
    21        {
    22            while(this.IsClosing !=true)
    23            {
    24                if(this.Interval !=0)
    25                {
    26                    Thread.Sleep(this.Interval);
    27                }

    28                //do something
    29                                
    30            }

    31
    32            this.thWorker =null;
    33        }

    34
    35        public void Close()
    36        {
    37            this.IsClosing =true;
    38        }

    39    }



    这是一种非Abort的结束方式.
     
    这里有个while循环.需要解释一下.
    一般来说,多线程运用到生产消费模式的情况比较多.
    最典型的:我在一个线程中将数据不断的填入一个队列.
    然后开很多线程不断的重队列中取出数据进行处理.

    这是,线程的执行方法通常是考虑如下的结构:
    WorkProc()
    {
        while(true)
         {
            if(队列中有数据)
            {
                取出一个进行处理。
            }
        }
    }

    BX_Thread模型主要对这个模型的循环部分进行了修改。
    WorkProc()
    {
        while(this.IsClosing !=true)
        {
            if(队列中有数据)
            {
                取出一个进行处理。
            }
        }
    }

    然后提供一个方法:BX_Thread.Close()
    只需要将 private bool IsClosing 改为true.
    线程就会自己退出循环了。
    一但退出循环,线程也就自然死亡而非谋杀了。

    所以这个是一种思路。BX_Thread可以这样使用:
    首先改写WorkProc()满足你的需求。
    BX_Thread thWorker =new BX_Thread( Parameter);
    thWorker.Run(1000);
    //这里的1000回导致循环一次Sleep1秒。如果Run(0)则不Sleep..
    //结束
    thWorker.Close();

    如果不想改写WorkProc
    那么可以考虑做一个接口。将线程和业务分离。

    我的意思,还有一点:并不是说Abort没有存在的价值。
    有时也会有Abort起来很方便的时候。
    但是大多数情况,需要Thread正常结束。
    而且用错了结束的方式,也会很麻烦。
  • 相关阅读:
    [NOIp pj 2007][Luogu P1095] 守望者的逃离
    [Noip 2009 普及组 T4] [Luogu P1070] 道路游戏
    跟风Manacher算法整理
    Luogu P2569 [SCOI2010] 股票交易
    qbzt2020五一DAY1T1集合——题解
    Cena使用教程
    2020.4.15校内测试
    康托展开学习笔记
    qbzt网格图路径问题——题解
    2-sat基础详解
  • 原文地址:https://www.cnblogs.com/tuyile006/p/436133.html
Copyright © 2011-2022 走看看