- 浏览: 457618 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (501)
- java基础 (45)
- struts2 (22)
- WebService (9)
- JavaScript (21)
- Java多线程 (37)
- Hibernate (5)
- Spring (31)
- 数据库 (4)
- 软件设计 (1)
- J2ee (8)
- oracle (2)
- Linux (41)
- Hadoop (1)
- Java集合 (3)
- 设计模式 (3)
- 高并发 (1)
- JVM (15)
- xml (2)
- 数据库事务 (3)
- 动态代理 (1)
- tomcat (9)
- 其他 (4)
- DNS域名 (3)
- CDN (2)
- javaapi (1)
- 编码问题 (6)
- CSS样式 (1)
- TCP学习 (3)
- Java IO (6)
- 常见异常问题 (1)
- 网络编程 (1)
- 开发工具 (5)
- Maven (10)
- ibatis (12)
- Velocity (8)
- Jquery (11)
- HTTP (9)
- 中间件 (3)
- 软件管理 (2)
- Html (2)
- Redis (3)
- 服务器 (1)
- 分布式文件系统 (1)
- 异常 (1)
- 杂谈 (1)
- ICE (4)
- cxf (1)
- Apache ActiveMQ (1)
- 好文 (1)
- Json (1)
- junit (2)
- JMS (1)
- java工具 (1)
- memcache (5)
- 加密解密 (1)
- powerdesigner (3)
- Enterprise Architect (1)
- ide (0)
- hessian (3)
- svn (1)
- xstream (1)
- idea (12)
- HttpClient (2)
- solr (4)
- lucene (2)
- 正则 (2)
- 商品设计 (1)
- poi (1)
- nginx (8)
- java基础;Java集合类 (1)
- javassist (1)
- JMeter (1)
- springmvc (1)
- Java对象序列化 (2)
- java nio (4)
- RandomAccessFile (1)
- socket (1)
- netty (3)
- 博客 (1)
- Spring AOP (7)
- mysql (10)
- 远程调用 (2)
- https (3)
- 加密 (3)
- sql (1)
- git (1)
- webx (1)
- eclipse (1)
- 上传下载 (2)
- log4j (4)
- Mac 系统使用 (6)
最新评论
-
wanxiaotao12:
aswang 写道总结的不错,
正在读《java并发编程实战 ...
Java并发编程实战-学习笔记 -
aswang:
总结的不错, 正在读《java并发编程实战》,看到其中的不变性 ...
Java并发编程实战-学习笔记 -
lianhan3344:
感谢博主分享!!!!
深入剖析Tomcat How+Tomcat+Works中文367页.pdf -
vict0323:
真的是酱紫么?求真相
Spring 实际开发项目中, 是否要default-autowire="byName"
线程池的作用:
线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
为什么要用线程池:
- 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
- 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)
线程池类
- package com.tdt.impl.ls;
- import java.util.LinkedList;
- /**
- * @project LocationGateway
- * @author sunnylocus
- * @verson 1.0.0
- * @date Aug 2, 2008
- * @jdk 1.4.2
- */
- public class ThreadPool extends ThreadGroup {
- private boolean isClosed = false; //线程池是否关闭
- private LinkedList workQueue; //工作队列
- private static int threadPoolID = 1; //线程池的id
- public ThreadPool(int poolSize) { //poolSize 表示线程池中的工作线程的数量
- super(threadPoolID + ""); //指定ThreadGroup的名称
- setDaemon(true); //继承到的方法,设置是否守护线程池
- workQueue = new LinkedList(); //创建工作队列
- for(int i = 0; i < poolSize; i++) {
- new WorkThread(i).start(); //创建并启动工作线程,线程池数量是多少就创建多少个工作线程
- }
- }
- /** 向工作队列中加入一个新任务,由工作线程去执行该任务*/
- public synchronized void execute(Runnable task) {
- if(isClosed) {
- throw new IllegalStateException();
- }
- if(task != null) {
- workQueue.add(task);//向队列中加入一个任务
- notify(); //唤醒一个正在getTask()方法中待任务的工作线程
- }
- }
- /** 从工作队列中取出一个任务,工作线程会调用此方法*/
- private synchronized Runnable getTask(int threadid) throws InterruptedException {
- while(workQueue.size() == 0) {
- if(isClosed) return null;
- System.out.println("工作线程"+threadid+"等待任务...");
- wait(); //如果工作队列中没有任务,就等待任务
- }
- System.out.println("工作线程"+threadid+"开始执行任务...");
- return (Runnable) workQueue.removeFirst(); //反回队列中第一个元素,并从队列中删除
- }
- /** 关闭线程池 */
- public synchronized void closePool() {
- if(! isClosed) {
- waitFinish(); //等待工作线程执行完毕
- isClosed = true;
- workQueue.clear(); //清空工作队列
- interrupt(); //中断线程池中的所有的工作线程,此方法继承自ThreadGroup类
- }
- }
- /** 等待工作线程把所有任务执行完毕*/
- public void waitFinish() {
- synchronized (this) {
- isClosed = true;
- notifyAll(); //唤醒所有还在getTask()方法中等待任务的工作线程
- }
- Thread[] threads = new Thread[activeCount()]; //activeCount() 返回该线程组中活动线程的估计值。
- int count = enumerate(threads); //enumerate()方法继承自ThreadGroup类,根据活动线程的估计值获得线程组中当前所有活动的工作线程
- for(int i =0; i < count; i++) { //等待所有工作线程结束
- try {
- threads[i].join(); //等待工作线程结束
- }catch(InterruptedException ex) {
- ex.printStackTrace();
- }
- }
- }
- /**
- * 内部类,工作线程,负责从工作队列中取出任务,并执行
- * @author sunnylocus
- */
- private class WorkThread extends Thread {
- private int id;
- public WorkThread(int id) {
- //父类构造方法,将线程加入到当前ThreadPool线程组中
- super(ThreadPool.this,id+"");
- this.id =id;
- }
- public void run() {
- while(! isInterrupted()) { //isInterrupted()方法继承自Thread类,判断线程是否被中断
- Runnable task = null;
- try {
- task = getTask(id); //取出任务
- }catch(InterruptedException ex) {
- ex.printStackTrace();
- }
- //如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程
- if(task == null) return;
- try {
- task.run(); //运行任务
- }catch(Throwable t) {
- t.printStackTrace();
- }
- }// end while
- }// end run
- }// end workThread
- }
package com.tdt.impl.ls; import java.util.LinkedList; /** * @project LocationGateway * @author sunnylocus * @verson 1.0.0 * @date Aug 2, 2008 * @jdk 1.4.2 */ public class ThreadPool extends ThreadGroup { private boolean isClosed = false; //线程池是否关闭 private LinkedList workQueue; //工作队列 private static int threadPoolID = 1; //线程池的id public ThreadPool(int poolSize) { //poolSize 表示线程池中的工作线程的数量 super(threadPoolID + ""); //指定ThreadGroup的名称 setDaemon(true); //继承到的方法,设置是否守护线程池 workQueue = new LinkedList(); //创建工作队列 for(int i = 0; i < poolSize; i++) { new WorkThread(i).start(); //创建并启动工作线程,线程池数量是多少就创建多少个工作线程 } } /** 向工作队列中加入一个新任务,由工作线程去执行该任务*/ public synchronized void execute(Runnable task) { if(isClosed) { throw new IllegalStateException(); } if(task != null) { workQueue.add(task);//向队列中加入一个任务 notify(); //唤醒一个正在getTask()方法中待任务的工作线程 } } /** 从工作队列中取出一个任务,工作线程会调用此方法*/ private synchronized Runnable getTask(int threadid) throws InterruptedException { while(workQueue.size() == 0) { if(isClosed) return null; System.out.println("工作线程"+threadid+"等待任务..."); wait(); //如果工作队列中没有任务,就等待任务 } System.out.println("工作线程"+threadid+"开始执行任务..."); return (Runnable) workQueue.removeFirst(); //反回队列中第一个元素,并从队列中删除 } /** 关闭线程池 */ public synchronized void closePool() { if(! isClosed) { waitFinish(); //等待工作线程执行完毕 isClosed = true; workQueue.clear(); //清空工作队列 interrupt(); //中断线程池中的所有的工作线程,此方法继承自ThreadGroup类 } } /** 等待工作线程把所有任务执行完毕*/ public void waitFinish() { synchronized (this) { isClosed = true; notifyAll(); //唤醒所有还在getTask()方法中等待任务的工作线程 } Thread[] threads = new Thread[activeCount()]; //activeCount() 返回该线程组中活动线程的估计值。 int count = enumerate(threads); //enumerate()方法继承自ThreadGroup类,根据活动线程的估计值获得线程组中当前所有活动的工作线程 for(int i =0; i < count; i++) { //等待所有工作线程结束 try { threads[i].join(); //等待工作线程结束 }catch(InterruptedException ex) { ex.printStackTrace(); } } } /** * 内部类,工作线程,负责从工作队列中取出任务,并执行 * @author sunnylocus */ private class WorkThread extends Thread { private int id; public WorkThread(int id) { //父类构造方法,将线程加入到当前ThreadPool线程组中 super(ThreadPool.this,id+""); this.id =id; } public void run() { while(! isInterrupted()) { //isInterrupted()方法继承自Thread类,判断线程是否被中断 Runnable task = null; try { task = getTask(id); //取出任务 }catch(InterruptedException ex) { ex.printStackTrace(); } //如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程 if(task == null) return; try { task.run(); //运行任务 }catch(Throwable t) { t.printStackTrace(); } }// end while }// end run }// end workThread }
2.测试类
- package com.tdt.test;
- import com.tdt.impl.ls.ThreadPool;
- public class ThreadPoolTest {
- public static void main(String[] args) throws InterruptedException {
- ThreadPool threadPool = new ThreadPool(3); //创建一个有个3工作线程的线程池
- Thread.sleep(500); //休眠500毫秒,以便让线程池中的工作线程全部运行
- //运行任务
- for (int i = 0; i <=5 ; i++) { //创建6个任务
- threadPool.execute(createTask(i));
- }
- threadPool.waitFinish(); //等待所有任务执行完毕
- threadPool.closePool(); //关闭线程池
- }
- private static Runnable createTask(final int taskID) {
- return new Runnable() {
- public void run() {
- // System.out.println("Task" + taskID + "开始");
- System.out.println("Hello world");
- // System.out.println("Task" + taskID + "结束");
- }
- };
- }
- }
package com.tdt.test; import com.tdt.impl.ls.ThreadPool; public class ThreadPoolTest { public static void main(String[] args) throws InterruptedException { ThreadPool threadPool = new ThreadPool(3); //创建一个有个3工作线程的线程池 Thread.sleep(500); //休眠500毫秒,以便让线程池中的工作线程全部运行 //运行任务 for (int i = 0; i <=5 ; i++) { //创建6个任务 threadPool.execute(createTask(i)); } threadPool.waitFinish(); //等待所有任务执行完毕 threadPool.closePool(); //关闭线程池 } private static Runnable createTask(final int taskID) { return new Runnable() { public void run() { // System.out.println("Task" + taskID + "开始"); System.out.println("Hello world"); // System.out.println("Task" + taskID + "结束"); } }; } }
结果:
- 工作线程0等待任务...
- 工作线程1等待任务...
- 工作线程2等待任务...
- 工作线程0开始执行任务...
- Hello world
- 工作线程0等待任务...
- 工作线程1开始执行任务...
- Hello world
- 工作线程1等待任务...
- 工作线程2开始执行任务...
- Hello world
- 工作线程2等待任务...
- 工作线程0开始执行任务...
- Hello world
- 工作线程0等待任务...
- 工作线程1开始执行任务...
- Hello world
- 工作线程1等待任务...
- 工作线程2开始执行任务...
- Hello world
- 工作线程2等待任务...
工作线程0等待任务... 工作线程1等待任务... 工作线程2等待任务... 工作线程0开始执行任务... Hello world 工作线程0等待任务... 工作线程1开始执行任务... Hello world 工作线程1等待任务... 工作线程2开始执行任务... Hello world 工作线程2等待任务... 工作线程0开始执行任务... Hello world 工作线程0等待任务... 工作线程1开始执行任务... Hello world 工作线程1等待任务... 工作线程2开始执行任务... Hello world 工作线程2等待任务...
发表评论
-
进程与线程的一个简单解释
2014-07-09 00:39 410进程与线程的一个简单解释 -
Callable和Future
2014-04-21 08:09 671Callable接口类似于Runnable,从名字就可以看 ... -
用实例揭示notify()和notifyAll()的本质区别
2014-04-15 08:43 469用实例揭示notify()和notifyAll()的本质区别 -
多线程
2014-02-15 20:44 408http://www.cnblogs.com/hoojo/ar ... -
Java偏向锁实现原理(Biased Locking)
2013-12-18 23:12 632Java偏向锁实现原理(Biased Locking) -
聊聊并发(一)——深入分析Volatile的实现原理
2013-09-12 00:40 711聊聊并发(一)——深入分析Volatile的实现原理 -
原子变量与原子类
2013-07-15 14:36 838Java多线程(二)之Atomic:原子变量与原子类 -
正确理解ThreadLocal
2013-05-13 00:25 723一般用法: class Test{ ... -
Future
2013-04-28 00:10 810如果想获取某一线程执行后的结果, 则使用Callable( ... -
ThreadPoolExecutor
2013-04-27 23:40 665ThreadPoolExecutor线程池 ... -
BlockingQueue深入分析
2013-04-27 23:18 769http://jiangzhengjun.iteye.co ... -
java线程组
2013-04-27 00:30 737线程组:线程组存在的意义,首要原因是安全。java默认创建的线 ... -
Java Thread join() 的用法
2013-04-25 00:58 676Java Thread join() 的用法 -
Java 线程池学习
2013-04-25 00:39 665Java 线程池学习 -
Java线程同步机制synchronized关键字的理解
2013-03-29 10:49 970由于同一进程的多个线程共享同一片存储空间,在带来方便的同时 ... -
Java线程中断的本质和编程原则
2013-03-29 00:06 778在历史上,Java试图提供过抢占式限制中断,但问题多多, ... -
java线程池Executor
2013-03-26 23:58 798http://www.iteye.com/topic/ ... -
信号量
2013-03-25 22:34 823Java线程:新特征-信号量 Java的信号量实际 ... -
Java多线程共享数据问题
2013-03-21 02:32 1551两个人分别用银行卡, 存折同时取钱, 以下是代码,并执行: ... -
Thread守护线程
2013-01-17 15:16 846概念 Java有两种Thread:守护线程、用户线程 ...
相关推荐
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线程池的原理和实现,挺全面的,分享给大家!