• 多线程学习系列:(六)线程池基础下


    这节我们按照线程池的核心思想来自定义一个简单的线程池:

      1) 池中使用的线程不少于一定数量,不多于一定数量

      2) 池中线程不够的时候创建,富裕的时候收回

      3) 任务排队,没有可用线程时,任务等待

      我们的目的只是实现这些“需求”,不去考虑性能(比如等待一段时间再去创建新的线程等策略)以及特殊的处理(异常),在实现这个需求的过程中我们也回顾了线程以及线程同步的基本概念。

      首先,把任务委托和任务需要的状态数据封装一个对象:

    public class WorkItem 
    { 
      public WaitCallback Action { get; set; } 
      public object State { get; set; } 
     
      public WorkItem(WaitCallback action, object state) 
      { 
        this.Action = action; 
        this.State = state; 
      } 
    }

      然后来创建一个对象作为线程池中的一个线程:

    public class SimpleThreadPoolThread 
    { 
      private object locker = new object(); 
      private AutoResetEvent are = new AutoResetEvent(false); 
      private WorkItem wi; 
      private Thread t; 
      private bool b = true; 
      private bool isWorking; 
     
      public bool IsWorking 
      { 
        get 
        { 
          lock (locker) 
          { 
            return isWorking; 
          } 
        } 
      } 
      public event Action<SimpleThreadPoolThread> WorkComplete; 
     
      public SimpleThreadPoolThread() 
      { 
        lock (locker) 
        { 
          // 当前没有实际任务 
          isWorking = false; 
        } 
        t = new Thread(Work) { IsBackground = true }; 
        t.Start(); 
      } 
     
      public void SetWork(WorkItem wi) 
      { 
        this.wi = wi; 
      } 
     
      public void StartWork() 
      { 
        // 发出信号 
        are.Set(); 
      } 
     
      public void StopWork() 
      { 
        // 空任务 
        wi = null; 
        // 停止线程循环 
        b = false; 
        // 发出信号结束线程 
        are.Set(); 
      } 
     
      private void Work() 
      { 
        while (b) 
        { 
          // 没任务,等待信号 
          are.WaitOne(); 
          if (wi != null) 
          { 
            lock (locker) 
            { 
              // 开始 
              isWorking = true; 
            } 
            // 执行任务 
            wi.Action(wi.State); 
            lock (locker) 
            { 
              // 结束 
              isWorking = false; 
            } 
            // 结束事件 
            WorkComplete(this); 
          } 
        } 
      }

  • 相关阅读:
    java 反射
    java 面试题
    Java构造和解析Json数据的两种方法详解一
    JAVA UUID 生成
    tomcat 插件
    webstorm 激活码
    maven环境搭建
    svn 安装网站
    2015.6.30 反弹的教训(想做T)
    2015.6.15 惨跌开始的反思
  • 原文地址:https://www.cnblogs.com/zhanghaichang/p/1967253.html
Copyright © 2020-2023  润新知