- 浏览: 396224 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (347)
- java基础 (58)
- ajax (10)
- s2sh (10)
- 版本控制 (4)
- 数据库 (34)
- 服务器 (4)
- 开发工具 (8)
- javascript (15)
- soockte (5)
- ext (2)
- 环境搭建 (7)
- struts2 (9)
- 找工作中的面试技巧 (2)
- 承接网站零活 (0)
- JNI+JONSE+OGNL (8)
- 性能优化 (4)
- Android开发 (5)
- xul (8)
- jquery (2)
- 线程 (3)
- jsp+jdbc (7)
- servlet (2)
- java对xml操作 (1)
- IO流的操作 (10)
- 项目开发前配置 (1)
- css (0)
- 上传、下载 (2)
- 知识探讨 (2)
- html (2)
- HQL (0)
- 工作技巧 (1)
- IT (1)
- Hibernate杂谈 (10)
- Spring杂谈 (35)
- DWR (5)
- JUnit测试 (3)
- EasyMock测试web (1)
- ibatis (6)
- maysql (5)
- C++ (0)
- 正则表达式(解剖) (1)
- 密码安全 (2)
- 上传 (1)
- socket (1)
- jni(java与c++结合) (1)
- jdk版本问题 (0)
- tomcat版本问题 (5)
- linux基本命令(初学) (7)
- linux项目发布 (1)
- 3年的经验总结 (1)
- 加解密 (2)
- 高级java阶段 (2)
- java内存分区 (1)
- 浏览器 (1)
- 职业规划 (1)
- 管理 (5)
- java语音 (1)
- SSH (1)
- jsp (3)
- extjs (1)
- uml (2)
- 加密 (1)
- web (2)
- Ant (1)
- 自述 (1)
- Linux (1)
- ssh源码解剖 (1)
- 代码优化 (1)
- 设计模式 (0)
- xml (2)
- JOSN (1)
- scala (0)
- hadoop (0)
- spark (0)
- hana (1)
- shior (1)
- java Word (6)
- java PDF (4)
- java Excel (0)
最新评论
-
高级java工程师:
ztao2333 写道谢谢。收藏下这个总结。呵呵
温习jdk和tomcat -
ztao2333:
大写的,不是大学的
温习jdk和tomcat -
ztao2333:
谢谢。收藏下这个总结。
温习jdk和tomcat -
the_small_base_:
你好,可以提供调用方法吗?需要的Jar,能发下源码吗?谢谢
java实现语音 -
高级java工程师:
文思涌动 写道楼主新年好。可否再传一遍给我,我没有收到, 不清 ...
s2sh整合
Java实现通用线程池
线程池通俗的描述就是预先创建若干空闲线程,等到需要用多线程去处理事务的时候去唤醒某些空闲线程执行处理任务,这样就省去了频繁创建线程的时间,因为频 繁创建线程是要耗费大量的CPU资源的。如果一个应用程序需要频繁地处理大量并发事务,不断的创建销毁线程往往会大大地降低系统的效率,这时候线程池就派 上用场了。
本文旨在使用Java语言编写一个通用的线程池。当需要使用线程池处理事务时,只需按照指定规范封装好事务处理对象,然后用已有的线程池对象去自动选择空 闲线程自动调用事务处理对象即可。并实现线程池的动态修改(修改当前线程数,最大线程数等)。下面是实现代码:
线程池通俗的描述就是预先创建若干空闲线程,等到需要用多线程去处理事务的时候去唤醒某些空闲线程执行处理任务,这样就省去了频繁创建线程的时间,因为频 繁创建线程是要耗费大量的CPU资源的。如果一个应用程序需要频繁地处理大量并发事务,不断的创建销毁线程往往会大大地降低系统的效率,这时候线程池就派 上用场了。
本文旨在使用Java语言编写一个通用的线程池。当需要使用线程池处理事务时,只需按照指定规范封装好事务处理对象,然后用已有的线程池对象去自动选择空 闲线程自动调用事务处理对象即可。并实现线程池的动态修改(修改当前线程数,最大线程数等)。下面是实现代码:
//ThreadTask .java package polarman.threadpool; /** * 线程任务 * @author ryang * 2006-8-8 */ public interface ThreadTask { public void run(); } //PooledThread.java package polarman.threadpool; import java.util.Collection; import java.util.Vector; /** * 接受线程池管理的线程 * @author ryang * 2006-8-8 */ public class PooledThread extends Thread { protected Vector tasks = new Vector(); protected boolean running = false; protected boolean stopped = false; protected boolean paused = false; protected boolean killed = false; private ThreadPool pool; public PooledThread(ThreadPool pool){ this.pool = pool; } public void putTask(ThreadTask task){ tasks.add(task); } public void putTasks(ThreadTask[] tasks){ for(int i=0; i<tasks.length; i++) this.tasks.add(tasks[i]); } public void putTasks(Collection tasks){ this.tasks.addAll(tasks); } protected ThreadTask popTask(){ if(tasks.size() > 0) return (ThreadTask)tasks.remove(0); else return null; } public boolean isRunning(){ return running; } public void stopTasks(){ stopped = true; } public void stopTasksSync(){ stopTasks(); while(isRunning()){ try { sleep(5); } catch (InterruptedException e) { } } } public void pauseTasks(){ paused = true; } public void pauseTasksSync(){ pauseTasks(); while(isRunning()){ try { sleep(5); } catch (InterruptedException e) { } } } public void kill(){ if(!running) interrupt(); else killed = true; } public void killSync(){ kill(); while(isAlive()){ try { sleep(5); } catch (InterruptedException e) { } } } public synchronized void startTasks(){ running = true; this.notify(); } public synchronized void run(){ try{ while(true){ if(!running || tasks.size() == 0){ pool.notifyForIdleThread(); //System.out.println(Thread.currentThread().getId() + ": 空闲"); this.wait(); }else{ ThreadTask task; while((task = popTask()) != null){ task.run(); if(stopped){ stopped = false; if(tasks.size() > 0){ tasks.clear(); System.out.println(Thread.currentThread().getId() + ": Tasks are stopped"); break; } } if(paused){ paused = false; if(tasks.size() > 0){ System.out.println(Thread.currentThread().getId() + ": Tasks are paused"); break; } } } running = false; } if(killed){ killed = false; break; } } }catch(InterruptedException e){ return; } //System.out.println(Thread.currentThread().getId() + ": Killed"); } } //ThreadPool.java package polarman.threadpool; import java.util.Collection; import java.util.Iterator; import java.util.Vector; /** * 线程池 * @author ryang * 2006-8-8 */ public class ThreadPool { protected int maxPoolSize; protected int initPoolSize; protected Vector threads = new Vector(); protected boolean initialized = false; protected boolean hasIdleThread = false; public ThreadPool(int maxPoolSize, int initPoolSize){ this.maxPoolSize = maxPoolSize; this.initPoolSize = initPoolSize; } public void init(){ initialized = true; for(int i=0; i<initPoolSize; i++){ PooledThread thread = new PooledThread(this); thread.start(); threads.add(thread); } //System.out.println("线程池初始化结束,线程数=" + threads.size() + " 最大线程数=" + maxPoolSize); } public void setMaxPoolSize(int maxPoolSize){ //System.out.println("重设最大线程数,最大线程数=" + maxPoolSize); this.maxPoolSize = maxPoolSize; if(maxPoolSize < getPoolSize()) setPoolSize(maxPoolSize); } /** * 重设当前线程数 * 若需杀掉某线程,线程不会立刻杀掉,而会等到线程中的事务处理完成 * 但此方法会立刻从线程池中移除该线程,不会等待事务处理结束 * @param size */ public void setPoolSize(int size){ if(!initialized){ initPoolSize = size; return; }else if(size > getPoolSize()){ for(int i=getPoolSize(); i<size && i<maxPoolSize; i++){ PooledThread thread = new PooledThread(this); thread.start(); threads.add(thread); } }else if(size < getPoolSize()){ while(getPoolSize() > size){ PooledThread th = (PooledThread)threads.remove(0); th.kill(); } } //System.out.println("重设线程数,线程数=" + threads.size()); } public int getPoolSize(){ return threads.size(); } protected void notifyForIdleThread(){ hasIdleThread = true; } protected boolean waitForIdleThread(){ hasIdleThread = false; while(!hasIdleThread && getPoolSize() >= maxPoolSize){ try { Thread.sleep(5); } catch (InterruptedException e) { return false; } } return true; } public synchronized PooledThread getIdleThread(){ while(true){ for(Iterator itr=threads.iterator(); itr.hasNext();){ PooledThread th = (PooledThread)itr.next(); if(!th.isRunning()) return th; } if(getPoolSize() < maxPoolSize){ PooledThread thread = new PooledThread(this); thread.start(); threads.add(thread); return thread; } //System.out.println("线程池已满,等待..."); if(waitForIdleThread() == false) return null; } } public void processTask(ThreadTask task){ PooledThread th = getIdleThread(); if(th != null){ th.putTask(task); th.startTasks(); } } public void processTasksInSingleThread(ThreadTask[] tasks){ PooledThread th = getIdleThread(); if(th != null){ th.putTasks(tasks); th.startTasks(); } } public void processTasksInSingleThread(Collection tasks){ PooledThread th = getIdleThread(); if(th != null){ th.putTasks(tasks); th.startTasks(); } } } 下面是线程池的测试程序 //ThreadPoolTest.java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import polarman.threadpool.ThreadPool; import polarman.threadpool.ThreadTask; public class ThreadPoolTest { public static void main(String[] args) { System.out.println(""quit" 退出"); System.out.println(""task A 10" 启动任务A,时长为10秒"); System.out.println(""size 2" 设置当前线程池大小为2"); System.out.println(""max 3" 设置线程池最大线程数为3"); System.out.println(); final ThreadPool pool = new ThreadPool(3, 2); pool.init(); Thread cmdThread = new Thread(){ public void run(){ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while(true){ try { String line = reader.readLine(); String words[] = line.split(" "); if(words[0].equalsIgnoreCase("quit")){ System.exit(0); }else if(words[0].equalsIgnoreCase("size") && words.length >= 2){ try{ int size = Integer.parseInt(words[1]); pool.setPoolSize(size); }catch(Exception e){ } }else if(words[0].equalsIgnoreCase("max") && words.length >= 2){ try{ int max = Integer.parseInt(words[1]); pool.setMaxPoolSize(max); }catch(Exception e){ } }else if(words[0].equalsIgnoreCase("task") && words.length >= 3){ try{ int timelen = Integer.parseInt(words[2]); SimpleTask task = new SimpleTask(words[1], timelen * 1000); pool.processTask(task); }catch(Exception e){ } } } catch (IOException e) { e.printStackTrace(); } } } }; cmdThread.start(); /* for(int i=0; i<10; i++){ SimpleTask task = new SimpleTask("Task" + i, (i+10)*1000); pool.processTask(task); }*/ } } class SimpleTask implements ThreadTask{ private String taskName; private int timeLen; public SimpleTask(String taskName, int timeLen){ this.taskName = taskName; this.timeLen = timeLen; } public void run() { System.out.println(Thread.currentThread().getId() + ": START TASK "" + taskName + """); try { Thread.sleep(timeLen); } catch (InterruptedException e) { } System.out.println(Thread.currentThread().getId() + ": END TASK "" + taskName + """); } } 使用此线程池相当简单,下面两行代码初始化线程池: ThreadPool pool = new ThreadPool(3, 2); pool.init(); 要处理的任务实现ThreadTask接口即可(如测试代码里的SimpleTask),这个接口只有一个方法run() 两行代码即可调用: ThreadTask task = ... //实例化你的任务对象 pool.processTask(task);
发表评论
-
System.gc()与Runtime.getRuntime().gc()区别
2019-07-23 14:34 725首先,我们需要明确一点的是,两个gc都会强制触发垃圾收集,它们 ... -
sql大全
2013-07-12 19:02 1003经典SQL语句大全 一、基础 1、说明: ... -
ATAL ERROR in native method: JDWP No transports initialized, jvmtiError=JVMTI_ER
2013-07-04 15:38 3972windos系统bug 因为我的机器比较内存比较少512M, ... -
java读取文本文件数据
2013-01-24 23:41 1060import java.io.*; public cla ... -
java复习(set 、list、map)
2013-01-24 23:27 1101复习 public static void main( ... -
java代码实现excel输到导入oracle
2012-07-31 13:28 14381.首先需要两个jar包jxl.jar,ojdbc.jar(注 ... -
使用doc命令将java工程生成.jar文件和war文件
2011-12-30 09:56 1286假定有一个Web应用:C:\myHome myHom ... -
堆栈 新的 认识
2011-10-31 14:24 1191A a = new A(); 在堆开辟空间,并把值存在堆 ... -
java实现捕捉屏幕
2011-10-15 16:17 1628要使用的是java.util.Robot类来捕获屏幕,可以实现 ... -
抽象类、抽象方法、接口
2011-10-13 10:55 1092抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象 ... -
java死锁
2011-10-10 22:05 826package cn.com.io.threadDem ... -
for和foreach使用?
2011-08-29 15:03 669在JDK5.0中加入了一个新的特性,那就是FOR-EACH循环 ... -
java开发群
2011-08-25 20:08 41欢迎java群1670293,希望有工作经验热情的加入---- ... -
JAVA中,如何判断一个字符串中包含的字符在另一个字符前面?
2011-06-30 13:34 3523[color=indigo]用它们在这个字符串中的位置来判断。 ... -
java实现判断A中是否包含B
2011-06-30 13:33 1231代码 package day6; public cla ... -
导入word到Fckeditor(java实现)
2011-06-24 13:58 1153最近项目可以说到达了一个里程碑,借这篇文章把前面的技术进行总结 ... -
使用3中不同的方式 从集合中取数据
2011-05-25 10:47 935代码 package iter; import jav ... -
Java反射
2011-05-05 08:49 815[color=blue]Java Reflection (JA ... -
Java反射机制
2011-05-05 08:48 711JAVA反射机制 JAVA ... -
get 和post
2011-05-05 08:39 806表单form的提交有两种方式,一种是get的方法,一种是pos ...
相关推荐
java 线程池 完整 源码 java 线程池 完整 源码
主要给大家介绍了关于java线程池使用后到底要不要关闭的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Reference: 《创建Java线程池》[1],《Java线程:新特征-线程池》[2], 《Java线程池学习》[3],《线程池ThreadPoolExecutor使用简介》[4],《Java5中的线程池实例讲解》[5],《ThreadPoolExecutor使用和思考》[6] ...
java 线程池 java 线程池 java 线程池 java 线程池
Java线程池使用说明Java线程池使用说明Java线程池使用说明
java线程池知识、
java线程池封装j
简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类
2.然后根据提示运行java命令执行示例程序,观看线程池的运行结果 目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来...
基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池...
Java线程池及观察者模式解决多线程意外死亡重启问题,附件含两个要运行代码!
讲述了java线程池的优点,参数,6种线程池的使用场景,线程池用到的handler,线程任务的提交方式等等。
java线程池实例java线程池实例E:\Users\Administrator\workspace
自定义实现Java线程池,学习大师设计思想,瞻仰大神笔法
java线程池的源码分析以及各种池之间的对比;
基于Java线程池技术的数据爬虫设计与实现.pdf
JAVA线程池的原理与实现.pdf
java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java...
1.媲美java线程池框架,整套源码资源,使用Intellij Idea开发工具,JDK1.8以上 2.带有测试代码 3.可以根据项目实际情况任意调整代码 4.任务队列、拒绝策略 5.BasicThreadPool.java、LinkedRunnableQueue.java、...
java线程池的原理和实现,挺全面的,分享给大家!