- 浏览: 539637 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (233)
- 设计模式 (1)
- WEBLOGIC (2)
- spring (2)
- struts (1)
- hibernate (8)
- SOA (11)
- j2ee (0)
- corba (0)
- linux (2)
- oracle (0)
- webService (17)
- javaMail (1)
- junit (3)
- java (45)
- 正则表达式 (7)
- java+xml (4)
- html (2)
- javaScript (6)
- ajax (1)
- mysql (0)
- eclipse (2)
- eclipse插件开发 (3)
- 软件工程 (5)
- ant (6)
- 开源包 (6)
- 学习网站 (7)
- Struts2 (18)
- JSP (1)
- 持续集成 (4)
- FreeMaker (6)
- 工作项目点点 (4)
- Maven2 (6)
- JQuery (1)
- 日志记录 (9)
- 工作流 (4)
- BPEL (1)
- extJs (1)
- 组件 (1)
- OSGI (10)
- ESB总线学习 (1)
- 错误解决 (2)
- JMX (3)
- 网络知识 (1)
最新评论
-
duanlongk:
这个问题解决了么?
java.lang.NoClassDefFoundError: org/apache/tuscany -
sotrip:
从上面结果来看,HelloWorld.class是由虚拟机的内 ...
如何实现自己的classloader -
zengsir2008:
哎,不太明白。。。。
OSGI DS 实例 -
ralfsumahe:
...
使用XFire开发Web Service客户端完整入门教程 -
liuqiao_0702:
...
osgi spring hibernate =
在多线程大师Doug Lea的贡献下,在JDK1.5中加入了许多对并发特性的支持,例如:线程池。
一、简介
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略
一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
当一个任务通过execute(Runnable)方法欲添加到线程池时:
如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
也就是:处理任务的优先级为:
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue
handler有四个选择:
ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy()
重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务
二、一般用法举例
//------------------------------------------------------------
//TestThreadPool.java
//package cn.simplelife.exercise;
import java.io.Serializable;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestThreadPool {
private static int produceTaskSleepTime = 2;
private static int consumeTaskSleepTime = 2000;
private static int produceTaskMaxNumber = 10;
public static void main(String[] args) {
//构造一个线程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),
new ThreadPoolExecutor.DiscardOldestPolicy());
for(int i=1;i<=produceTaskMaxNumber;i++){
try {
//产生一个任务,并将其加入到线程池
String task = "task@ " + i;
System.out.println("put " + task);
threadPool.execute(new ThreadPoolTask(task));
//便于观察,等待一段时间
Thread.sleep(produceTaskSleepTime);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 线程池执行的任务
* @author hdpan
*/
public static class ThreadPoolTask implements Runnable,Serializable{
private static final long serialVersionUID = 0;
//保存任务所需要的数据
private Object threadPoolTaskData;
ThreadPoolTask(Object tasks){
this.threadPoolTaskData = tasks;
}
public void run(){
//处理一个任务,这里的处理方式太简单了,仅仅是一个打印语句
System.out.println("start .."+threadPoolTaskData);
try {
////便于观察,等待一段时间
Thread.sleep(consumeTaskSleepTime);
} catch (Exception e) {
e.printStackTrace();
}
threadPoolTaskData = null;
}
public Object getTask(){
return this.threadPoolTaskData;
}
}
}
//------------------------------------------------------------
说明:
1、在这段程序中,一个任务就是一个Runnable类型的对象,也就是一个ThreadPoolTask类型的对象。
2、一般来说任务除了处理方式外,还需要处理的数据,处理的数据通过构造方法传给任务。
3、在这段程序中,main()方法相当于一个残忍的领导,他派发出许多任务,丢给一个叫 threadPool的任劳任怨的小组来做。
这个小组里面队员至少有两个,如果他们两个忙不过来,任务就被放到任务列表里面。
如果积压的任务过多,多到任务列表都装不下(超过3个)的时候,就雇佣新的队员来帮忙。但是基于成本的考虑,不能雇佣太多的队员,至多只能雇佣 4个。
如果四个队员都在忙时,再有新的任务,这个小组就处理不了了,任务就会被通过一种策略来处理,我们的处理方式是不停的派发,直到接受这个任务为止(更残忍!呵呵)。
因为队员工作是需要成本的,如果工作很闲,闲到 3SECONDS都没有新的任务了,那么有的队员就会被解雇了,但是,为了小组的正常运转,即使工作再闲,小组的队员也不能少于两个。
4、通过调整 produceTaskSleepTime和 consumeTaskSleepTime的大小来实现对派发任务和处理任务的速度的控制,改变这两个值就可以观察不同速率下程序的工作情况。
5、通过调整4中所指的数据,再加上调整任务丢弃策略,换上其他三种策略,就可以看出不同策略下的不同处理方式。
6、对于其他的使用方法,参看jdk的帮助,很容易理解和使用。
文章出处:http://www.diybl.com/course/3_program/java/javajs/200797/70003.html
发表评论
-
类加载机制转载
2009-06-23 09:58 2378Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某 ... -
OSGI环境下配置log4j日志
2009-05-07 14:07 1448log4j相信大家都用过的 ... -
Java虚拟机类装载:原理、实现与应用
2009-05-07 09:50 1532Java虚拟机类装载:原理、实现与应用 By jo ... -
Java程序类加载完全揭密
2009-05-07 09:49 1118Java程序类加载完全揭密 ... -
Java的类装载器(Class Loader)和命名空间(NameSpace)
2009-05-07 09:48 1791Java的类装载器(Class Loader)和命名空间(Na ... -
Java类装载体系中的隔离性
2009-05-07 09:28 1431Java类装载体系中的隔离性 正文 Java中类 ... -
了解 JAVA classloader
2009-05-07 09:21 1106什么是 ClassLoader? ... -
如何实现自己的classloader
2009-05-07 09:12 2060如何实现自己的classloader 如何实现自己的clas ... -
ClassLoader原理
2009-05-07 09:06 1039JVM规范定义了两种类型的类装载器:启动内装载器(bootst ... -
MD5
2009-03-17 09:17 1027使用 Java 生成 MD5 编码 MD5即 ... -
JAVA字符串处理函数列表一览
2009-03-14 16:48 2044Java中的字符串也是一连串的字符。但是与许多其他的计算机语言 ... -
StringTokenizer(字符串分析解析类型)(转)
2009-03-14 16:35 3142功效:将字符串以定界符为界,分析为一个个的token(可理解为 ... -
JAVA乱码分析
2009-03-14 16:33 2198UNICODE编码,它采用双字 ... -
java.util.UUID
2008-12-19 18:01 4976GUID是一个128位长的数字,一般用16进制表示。算法的核心 ... -
java应用程序中动态生成PDF文件
2008-12-11 17:05 1207很多应用程序要求动态 ... -
JAVA和JAVAC 命令行
2008-12-11 17:03 2613javac和java命令行中的-classpath选项这是个很 ... -
创建java的可执行文件
2008-12-11 16:59 1408Jar工具的作用是java程序中若干文件联合压缩到一个Jar包 ... -
深入对象复制与比较
2008-12-04 10:09 15371.对象的复制2.clone()的使用3.对象实例的比较/// ... -
解析Java对象的equals()和hashCode()的使用
2008-12-04 10:07 877在Java语言中,equals()和h ... -
Java基础:深入 JAVA对象的复制与比较
2008-12-04 10:06 8891.对象的复制2.clone()的使用3.对象实例的比较/// ...
相关推荐
"JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用。该类库不提供远程的消息功能,其设计的宗旨是实现一个内存中的消息传递机制. 主要特点有: * All ...
9. **并发API(Concurrent APIs)**: JDK1.5加强了对多线程编程的支持,引入了并发工具类如`java.util.concurrent`包,包括`ExecutorService`、`Semaphore`、`CountDownLatch`等,以及`java.util.concurrent.atomic`...
在并发编程方面,JDK1.5引入了并发工具类(java.util.concurrent),包括Semaphore、CyclicBarrier、CountDownLatch等,这些工具极大地简化了多线程编程中的同步和协调。 在内存模型和并发性能上,JDK1.5引入了Java...
JDK 1.5引入了java.util.concurrent包,其中包含了线程池的实现,使得并发编程更加便捷和高效。线程池的核心在于它的设计策略,包括核心线程数、最大线程数、线程存活时间、工作队列以及拒绝策略。 线程池的主要类...
对于并发编程,JDK1.5引入了java.util.concurrent包,其中包括了线程池、Future、Callable接口以及CyclicBarrier和Semaphore等同步工具类,极大地丰富了并发处理能力,提升了多线程环境下的性能和可维护性。...
如何启动:以win7系统为例,最好jdk8 1.打开cmd,cd到jdk的path,本机是:cd C:\Java\jdk6\bin ...java -cp D:\javaConcurrentAnimated.jar vgrazi.concurrent.samples.launcher.ConcurrentExampleLauncher
在并发编程方面,JDK 1.5引入了并发工具类(java.util.concurrent package),如Executor框架、Semaphore、CountDownLatch和CyclicBarrier等,这些工具大大简化了多线程编程,提高了并发应用的效率和可靠性。...
JDK 1.5引入了java.util.concurrent包,包含了线程池、并发集合和并发工具类,极大地改善了多线程编程的效率和可靠性。 11. **NIO.2(New I/O 2)** 虽然NIO.2是在JDK 7中引入的,但JDK 1.5开始的NIO(非阻塞I/O...
合适研究底层研发员,但,一般程序员也必须掌握的要点 JDK研究系列--》util.concurrent(java.util part3)
9. **并发改进(Concurrency Enhancements)**:包括`java.util.concurrent`包的引入,提供了线程安全的数据结构和高级并发工具,如`Executor`框架,简化了多线程编程。 10. **NIO.2(New I/O 2)**:虽然JDK 1.5中...
JDK 1.5引入了`java.util.concurrent`包,提供了线程安全的数据结构和并发编程工具,如`Executor`框架、`Future`接口、`Semaphore`、`CyclicBarrier`等,极大地简化了多线程编程。 ### 10. **Synchronized关键字...
JDK 1.5引入的`java.util.concurrent`包极大地简化了并发编程,提供了高效、可控的线程池管理。熟练掌握这些工具,能帮助开发者编写出更加稳定、高效的多线程应用程序。通过深入学习和实践,可以更好地理解和利用...
- **多线程**:`java.lang.Thread`和`java.util.concurrent`包提供了多线程编程的支持,包括线程创建、同步控制和并发工具类。 - **网络编程**:`java.net`包提供了Socket和ServerSocket类,用于实现基于TCP/IP的...
9. **并发编程改进**:包括`java.util.concurrent`包的引入,提供了线程池、Future、CyclicBarrier等高级并发工具,简化了多线程编程。 **安装过程** JDK 1.5.0.22的64位安装版文件名为`jdk-1_5_0_22-windows-amd...
import java.util.concurrent.*; ConcurrentHashMap, String> bb = new ConcurrentHashMap(); bb.put("1", "wj"); bb.put("2", "ry"); for (String key : bb.keySet()) { bb.remove(key); } ``` 在编写多...
12. **并发编程改进**:包括`java.util.concurrent`包的引入,提供了线程池、并发容器、并发工具类等,简化了多线程编程。 13. **XML支持的增强**:JAXB(Java Architecture for XML Binding)的引入,使得Java对象...
9. **并发编程改进(Concurrency Improvements)**:提供了`java.util.concurrent`包,包含了许多线程安全的数据结构和同步工具类。 **绿色版JDK1.5的使用** 绿色版JDK1.5通常是一个.zip或.rar文件,解压后包含bin...