【多线程】一个简单的线程池Demo
来源:互联网 发布:windows用户管理工具 编辑:程序博客网 时间:2024/05/16 15:05
首先介绍一下为什么要使用线程池?使用线程池的原因是因为线程的创建和销毁的代价是比较高的,而且是与业务无关的。一般情况下,我们会想着把CPU用在处理具体的业务上面,而不是用在辅助业务的创建和销毁上面,所以就有了线程池。
线程池类:
public class ThreadPool { private static ThreadPool instance = null; //空闲的线程队列 private List<Worker> idleThreads; //已有的线程总数 private int threadCounter; private boolean isShutDown = false; private ThreadPool(){ this.idleThreads = new Vector(5); threadCounter = 0; } public int getCreatedThreadsCount(){ return threadCounter; } //取得线程池的实例 public synchronized static ThreadPool getInstance(){ if(instance == null){ instance = new ThreadPool(); } return instance; } //将线程放入池中 protected synchronized void repool(Worker repoolingThread){ if(!isShutDown){ idleThreads.add(repoolingThread); }else{ //关闭线程 repoolingThread.shutDown(); } } //停止池中的所有线程 public synchronized void shutdown(){ isShutDown = true; for(int threadIndex = 0; threadIndex < idleThreads.size(); threadIndex++){ Worker idleThread = (Worker)idleThreads.get(threadIndex); idleThread.shutDown(); } } //执行任务 public synchronized void start(Runnable target){ Worker thread = null; //如果有空闲线程,则直接使用 if(idleThreads.size() > 0){ int lastIndex = idleThreads.size() - 1; thread = (Worker)idleThreads.get(lastIndex); idleThreads.remove(lastIndex); //立即执行这个任务 thread.setTarget(target); }else{ //没有空闲线程,则创建新线程 threadCounter++; //创建新线程 thread = new Worker(target, "PThread #"+threadCounter, this); //启动这个线程 thread.start(); } }}
Worker类:
public class Worker extends Thread{ //线程池 private ThreadPool pool; //任务 private Runnable target; private boolean isShutDown = false; private boolean isIdle = false; public Worker(Runnable target, String name, ThreadPool pool){ super(name); this.pool = pool; this.target = target; } public Runnable getTarget(){ return target; } public boolean isIdle(){ return isIdle; } public void run(){ while(!isShutDown){ isIdle = false; if(target != null){ //运行任务 target.run(); } //任务结束了 isIdle = true; try{ //该任务结束后,不关闭线程,而是放入线程池空闲队列 pool.repool(this); synchronized(this){ //线程空闲,等待新的任务到来 wait(); } }catch(InterruptedException ie){ } isIdle = false; } } public synchronized void setTarget(java.lang.Runnable newTarget){ target = newTarget; //设置了任务之后,通知run方法开始执行这个任务 notifyAll(); } public synchronized void shutDown(){ isShutDown = true; notifyAll(); }}
阅读全文
1 0
- 【多线程】一个简单的线程池Demo
- 一个简单的线程demo
- 线程池的简单Demo
- Java多线程____一个简单的多线程demo
- 多线程学习---写一个简单的线程
- 用Pthread创建线程的一个简单Demo
- 线程池的简单实现Demo
- c# 线程池RegisterWaitForSingleObject的一个Demo
- 线程池,多线程使用方法,demo
- 一个简单的线程池
- 一个简单的线程池
- 一个简单的线程池
- 一个简单的线程池
- 一个简单的线程池
- 一个简单的线程池
- 一个简单的线程池
- 多线程学习--简单的线程池创建
- 多线程之线程池的简单实现
- mysql全文检索match() against
- 集群技术(四)nginx1.4 -- nginx负载均衡后Session一致性问题之memcached
- solr通过http请求删除数据
- 导航栏随屏幕移动而变化
- mysql数据使用非默认编码进行查询的问题
- 【多线程】一个简单的线程池Demo
- Linux中使用sed命令替换字符串小结
- java炒冷饭系列12 嵌套类(静态内部类)
- faster rcnn代码阅读
- Android自动获取焦点并弹出输入法的问题
- 《Advanced Bash-scripting Guide》学习(二):测试脚本调用的参数是否正确
- servlet创建接口
- WIN10环境下MAVEN的安装与配置
- jdk源码学习----1.如何查看jdk源码