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正常结束。
    而且用错了结束的方式,也会很麻烦。
  • 相关阅读:
    Nodejs初阶之express
    windows 下安装nodejs及其配置环境
    NodeJS、NPM安装配置与测试步骤(windows版本)
    nodejs npm常用命令
    系列文章--Node.js学习笔记系列
    系列文章--8天学通MongoDB
    python 特征选择 绘图 + mine
    TCP/IP 详解卷一
    CNN检测模型统计检出率
    leetcode 572. Subtree of Another Tree
  • 原文地址:https://www.cnblogs.com/tuyile006/p/436133.html
Copyright © 2011-2022 走看看