[讨论] 线程池 vs 专有线程
首先,解释一下[专有线程]这里我所表达的意思:就是对某一类任务(即调用同一个方法)用一个Thread,然后在自己封装一个处理列表,通过这一个线程循环处理任务。这里我给出我的代码:
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Common
{
///<summary>
/// @author: gxjiang
/// @date : 2011/4/7
/// @description : 提供一个专有的线程封装,使得这个线程可以去处理一系列的事情。
///</summary>
publicclass ExclusiveThread<T>
{
///<summary>
/// 任务列表
///</summary>
private Queue<T> TaskQueue =new Queue<T>();
///<summary>
/// 是否被停止
///</summary>
privatebool IsStopped =false;
///<summary>
/// 处理的线程
///</summary>
private Thread InnerThread;
///<summary>
/// 出队列时处理方法
///</summary>
private DequeueHandler CallBack;
publicdelegatevoid DequeueHandler(T item);
///<summary>
/// 线程停止事件
///</summary>
publicevent EventHandler Stopped;
public ExclusiveThread(DequeueHandler callBackFunc)
{
this.CallBack = callBackFunc;
this.CreateInnerThread();
}
privatevoid ThreadFunction()
{
while (true)
{
lock (this.TaskQueue)
{
if (this.TaskQueue.Count >0)
{
T item =this.TaskQueue.Dequeue();
this.OnDequeue(item);
}
else
{
if (this.IsStopped)
this.OnStop();
break;
}
}
}
}
privatevoid OnStop()
{
EventHandler handler = Stopped;
if (handler !=null)
handler(this, EventArgs.Empty);
}
privatevoid OnDequeue(T item)
{
if (this.CallBack !=null)
this.CallBack(item);
}
privatevoid AbortInnerThread()
{
try
{
if (this.InnerThread !=null)
this.InnerThread.Abort();
}
catch
{
}
}
privatevoid CreateInnerThread()
{
this.InnerThread =new Thread(new ThreadStart(ThreadFunction));
}
privatevoid InnerThreadAction()
{
if (this.InnerThread.ThreadState == ThreadState.Unstarted) this.InnerThread.Start();
elseif (this.InnerThread.ThreadState == ThreadState.Stopped ||this.InnerThread.ThreadState == ThreadState.Aborted)
{
this.CreateInnerThread();
this.InnerThread.Start();
}
}
///<summary>
/// 增加处理任务
/// 若线程么有启动则启动
/// 若已经启动就添加到任务队列中
/// 若任务处理完了,则挂起线程
///</summary>
///<param name="item">处理任务</param>
publicvoid Add(T item)
{
if (this.IsStopped)
thrownew ExclusiveThreadException("此线程已经停止,不可以再添加任务。");
lock (this.TaskQueue)
{
this.TaskQueue.Enqueue(item);
this.InnerThreadAction();
}
}
///<summary>
/// 停止处理任务,触发Stopped事件
///</summary>
publicvoid Stop()
{
lock (this.TaskQueue)
{
this.IsStopped =true;
if (this.TaskQueue.Count ==0&&this.InnerThread.ThreadState == ThreadState.Stopped)
this.OnStop();
}
}
///<summary>
/// 重新开始任务,之后调用[Add]方法加任务
///</summary>
publicvoid Resume()
{
this.IsStopped =false;
}
}
///<summary>
/// 自定义异常
///</summary>
publicclass ExclusiveThreadException : ApplicationException
{
public ExclusiveThreadException():base() { }
public ExclusiveThreadException(string msg) : base(msg) { }
public ExclusiveThreadException(string msg, Exception innerException) : base(msg, innerException) { }
}
}
在这个线程的包装类中,我称之为专有线程或者定制线程,我可以把很多相同的任务放在这个队列中,让这一个线程循环处理。
另一个方式是用线程池(ThreadPool),这个我也想过去用,可是我个人觉得并不是所有时候都能用,因为有时候还是得考虑一下线程的执行先后顺序。
这里我提出来这个问题?到底是线程池去处理很多的线程较好?还是用我这种专有线程去处理一类任务?各有什么缺憾之处呢?
希望大家给予讨论!
转载于:https://www.cnblogs.com/gxjiang/archive/2011/04/07/2008014.html
[讨论] 线程池 vs 专有线程相关推荐
- 深入浅出 Java Concurrency (33): 线程池 part 6 线程池的实现及原理 (1)[转]
线程池数据结构与线程构造方法 由于已经看到了ThreadPoolExecutor的源码,因此很容易就看到了ThreadPoolExecutor线程池的数据结构.图1描述了这种数据结构. 图1 Thre ...
- 动态调整线程池_调整线程池的重要性
动态调整线程池 无论您是否知道,您的Java Web应用程序很可能都使用线程池来处理传入的请求. 这是许多人忽略的实现细节,但是迟早您需要了解如何使用该池以及如何为您的应用程序正确调整池. 本文旨在说 ...
- 对警报线程池的警报线程_如何建立更好的警报
对警报线程池的警报线程 背景 (Background) One of the most popular complaints from developers to DBAs involves aler ...
- 对警报线程池的警报线程_检测和警报SQL Server代理丢失的作业
对警报线程池的警报线程 摘要 (Summary) While alerting on failed SQL Server Agent jobs is straightforward, being no ...
- 对警报线程池的警报线程_审核和警报SQL Server作业状态更改(启用或禁用)
对警报线程池的警报线程 In this article, we will talk about how to track enabled or disabled SQL jobs in SQL Ser ...
- java线程池newfi_Java 线程池中的线程复用是如何实现的?
前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 那么就来和大家探讨下这个问题,在线程池中,线程会从 workQueue 中读取任务来执行,最小的执行单位就是 Worker,Worke ...
- 线程池的核心线程会销毁吗?
今天跟别人讨论了线程池的核心线程会不会销毁的问题 先上代码 public static void main(String[] args) throws InterruptedException {Th ...
- 【操作系统】操作系统知识点整理;C++ 实现线程池与windows 线程池的使用;
文章目录 体系结构 冯诺依曼 存储结构 cache常见的组织结构 cache命中 缓存一致性 硬中断.软中断 操作系统结构 内核 Linux宏内核 内存管理 虚拟内存 内存管理 - 分段 - 分页 - ...
- 对警报线程池的警报线程_警报引起的辛劳
对警报线程池的警报线程 对于所有DevOps团队来说,辛苦的工作是一件令人担忧的事情. 辛劳产生的原因很多. 这使它成为一个非常棘手的问题,几乎不可能完全消除. 因此,团队必须解决的最佳策略是尽可能地 ...
最新文章
- polyrate使用方法_pytorch必须掌握的的4种学习率衰减策略
- 走马观花AutoML
- KVM 安装windows 虚拟机
- ArcGIS Server for JavaScript 3.3 的安装部署
- 这是一段关乎你的代码:你的未来 我们正在参与
- python numpy ndarray之basic operations
- android 图片方向,Android图片处理:识别图像方向并显示
- 操作两个表的SQL语句,可用在数据源中
- OpenWrt系列教程汇总 OpenWrt简体中文Wiki
- Linux 环境下 vi/vim 编辑器常用命令
- 网络运维网管解决方案
- 解密宝典——十招教你学会软件破解
- stm32 led屏控制卡_如何实现LED双面透明显示屏,双面LED透明屏
- 【算法】最长递增子序列问题
- 滴滴出行A/B测试数据分析
- 模仿360安全卫士项目笔记9
- uni-app封装请求方法和loading样式
- AUTOCAD——文字显示方式、CAD怎么直接打开天正图纸
- Arduino与Proteus仿真实例-74HC148优先编码器驱动仿真
- 2.AT32F403A例程之-STemWin移植
热门文章
- cocos游戏源码怎么用_亲子游戏怎么玩?游戏方式用对了,才会事半功倍
- clevo风扇调速软件_YVP变频调速电机
- php 下载脱离服务器,php – 强制从外部服务器下载并重命名
- java数据模型公共类_UML数据建模工具之Enterprise Architect(EA)实例
- OPENCV图像数据类型
- 对象必须实现 iconvertible_Java I/O 流之数据流_对象流
- GMS(cts、gsi、vts、gts、ctsv)问题总结
- @RequestParam @PathVariable
- 知乎快捷取消我关注的问题chrome插件
- EJB2.0版本的HelloWorld