- 浏览: 634551 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (314)
- 生活 (2)
- c# (37)
- 技术 (3)
- 400电话 (0)
- 400常见问题 (0)
- 400资费 (0)
- html (7)
- css (0)
- 数据库 (7)
- javascript (16)
- php (33)
- asp.net mvc2 (10)
- mysql (9)
- C# 3.0 LinQ (10)
- vs2005或vs2008 (4)
- flash and as3 (7)
- fms (1)
- dedeCMS (11)
- java (33)
- j2me (1)
- swing (1)
- c++ (1)
- jquery easyui (3)
- jquery (5)
- android (29)
- MongoDB (9)
- VtigerCRM (1)
- test (0)
- linux (30)
- nutch (2)
- SqlServer数据库 (2)
- 数据检索 (2)
- java抓取 (11)
- 乐天 (1)
- 淘宝 (1)
- Silverlight4.0 (6)
- sphinx实时索引 (5)
- ecshop (9)
- codeigniter(CI) (3)
- axure6 (1)
- 京东店铺装修教程 (2)
- xpath (1)
- joomla (2)
- bpm (1)
- Bootstrap (2)
- knockout (4)
- ecstore (4)
- css3 (1)
- 微信 (2)
- dede (0)
- soa_edi (1)
- odoo (0)
- web (1)
最新评论
-
骑着蜗牛超F1:
在ie6下报了个stack overflow at line ...
兼容ie6和ie7 的16进制码流在html中显示为图片代码(base64) -
冰之海洋:
好像少了一句代码吧? FloatingFunc.show(th ...
android 一直在最前面的浮动窗口效果 -
yanzhoupuzhang:
连接有问题!
iis7.0官方下载 IIS 7.0(微软Web服务器组件IIS 7.0) 官方(windows 2003,XP,2000) -
whatable:
唉,楼主你都没有搞清楚重量级和轻量级。。。。既然引用了SWT, ...
java swing 内置浏览器打开网页显示flash图表-swt Browser应用 -
yy_owen:
我晕啊,你链接的什么内容额,我要的iis,你链接个视频什么意思 ...
iis7.0官方下载 IIS 7.0(微软Web服务器组件IIS 7.0) 官方(windows 2003,XP,2000)
在多线程大师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 = "task400@ " + 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的帮助,很容易理解和使用。
发表评论
-
Java 线程中的Join、wait、notify,sleep
2016-06-22 17:28 4541.wait和notify这两个方法都是Object中的方法 ... -
Java多线程sleep(),join(),interrupt(),wait(),notify()
2016-06-22 17:25 510浅析 Java Thread.join() ... -
Java和C#运行命令行并获取返回值 运行bat文件
2015-08-04 10:45 1332Java运行命令行的例子 import java.io.B ... -
HttpClient的超时用法小记
2012-05-06 08:23 972HttpClient在使用中有两个超时时间,是一直接触 ... -
XPath 语法 org.dom4j.Document
2012-02-07 13:12 1333XPath 使用路径表达式 ... -
Nutch命令大全
2011-12-28 15:12 1428Nutch采用了一种命令的方式进行工作,其命令可以是对局域网方 ... -
Nutch1.2搜索引擎使用详解
2011-12-27 17:12 1690Nutch作为一款刚刚诞生 ... -
ECLIPSE java.lang.OutOfMemoryError: PermGen space 错误
2011-12-21 15:03 1119ECLIPSE 最近一段时间经常报错,看了日志,有如下错误信息 ... -
nutch环境配置在windows系统上(借助Cygwin)
2011-11-16 11:09 1799nutch环境配置在windows系统上必须要安装【Cygwi ... -
Heritrix 和 Nutch 比较与分析(java开源网络爬虫)
2011-11-15 11:01 7459Heritrix项目介绍 Heritrix工程 ... -
heritrix 下载、安装、配置、以及简单开发
2011-11-04 11:36 1394一、下载: 到www.sourcef ... -
java 如何判断Socket已断开
2011-09-14 13:34 1735最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连 ... -
java 程序内存溢出问题查找
2011-04-10 18:00 984这段是时间用java swing做了一个小程序,但是运行一点时 ... -
jtable 隐藏表头标题行
2011-04-08 10:59 3278今天需要把JTable的表头也就是标题行给隐藏掉,在晚上找了一 ... -
java FrameView 启动最大化
2011-03-30 08:49 1534FrameViewzView = new ... -
Swing窗口Linux下不支持最大化问题
2011-03-28 10:15 1003由于最近一直在Linux下工作,今天遇到了Swing窗口不能最 ... -
java 抓取网页内容,可设定代理(HttpURLConnection)
2011-03-11 09:41 1464/* * To change this template, ... -
swing下 改变窗口样式为windows风格(swing控件样式不美观解决方案)
2011-03-02 15:52 2642在windows环境下可以用下面两种方法使窗口显示window ... -
swt Browser 如何打开新url链接地址
2011-02-28 17:27 1712上一篇文章【java swing 内置浏览器打开网页显示fla ... -
java swing 内置浏览器打开网页显示flash图表-swt Browser应用
2011-02-25 16:45 3870今天在网上找了好久如何用在java swing打开网页,从而实 ...
相关推荐
"JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
JDK 1.5引入了java.util.concurrent包,其中包含了线程池的实现,使得并发编程更加便捷和高效。线程池的核心在于它的设计策略,包括核心线程数、最大线程数、线程存活时间、工作队列以及拒绝策略。 线程池的主要类...
在Java中,`java.util.concurrent`包中的`ThreadPoolExecutor`是线程池的主要实现。 **ThreadPoolExecutor的使用** `ThreadPoolExecutor`包含以下几个关键参数: 1. **corePoolSize**:核心线程数,即使没有任务,...
JDK 自带线程池是 Java 语言中用于管理和执行线程的工具,旨在提高多线程编程的效率和灵活性。本文将详细介绍 JDK 自带线程池的组成、创建方法、优点和常见应用场景。 多线程技术 多线程技术是指在一个处理器单元...
4. **多线程**:`java.lang.Thread`和`java.util.concurrent`包中的类,如`ExecutorService`、`ThreadPoolExecutor`等,展示了如何实现并发和异步执行。 5. **反射机制**:`java.lang.reflect`包中的类,如`Class`...
backport-util-concurrent库,正如其名,是一种将Java 5及以上版本的并发特性“回移植”到Java 1.4及更早版本的工具,使得开发者能在较旧的Java环境中享受现代并发编程的优势。本文将深入探讨这个库的2.2和3.1两个...
在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,其中包含了一系列关于线程池的接口和类,极大地丰富了线程池的应用场景和管理方式。 线程池的主要作用是限制系统...
线程池在Java中是通过`java.util.concurrent`包下的`ThreadPoolExecutor`类实现的。 线程池的主要作用是限制系统中执行线程的数量,通过预先配置好的线程数量,可以避免过多线程导致的资源浪费和系统拥挤,从而提高...
首先,Java中的线程池设计始于JDK 5.0,主要通过`java.util.concurrent`包中的`Executor`接口实现。这个接口仅有一个`execute()`方法,用于提交执行任务。我们也将遵循这个设计,实现一个简单的线程池类`...
Java中,线程池是通过java.util.concurrent.ThreadPoolExecutor类实现的,它为Java应用程序提供了一种有效地管理线程资源的方式。从JDK 1.5开始,Java并发API得到了增强,提供了更为强大的并发工具和库,其中就包括...
线程池的引入始于JDK 1.5,它引入了`java.util.concurrent`包,提供了`Executor`、`ExecutorService`和相关的实现类,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。 线程池的主要作用是限制系统中同时...
这份JDK_API中文版文档对于学习和掌握Java编程至关重要,它能帮助开发者快速查找和理解类库的使用方法,解决编程过程中遇到的问题。在实际工作中,应经常查阅和参考,以深化对Java的理解和应用。
Java.util.concurrent包是JDK5引入的一个重要更新,它包含了Doug Lea设计的并发库,极大地提升了Java处理并发的能力。这个库提供了高效且易用的多线程工具,包括线程池、同步器和定时任务管理等。 线程池是Java多...
我们可以扩展`java.util.concurrent.ThreadPoolExecutor`类,它提供了更复杂的线程池管理功能,包括工作队列、核心线程数、最大线程数等参数。 3. JDK 中的线程池和工作机制 JDK内置了多种线程池实现,如`...
**JDK1.6 API(应用程序接口)是Java开发工具包的一个核心组成部分,它提供了大量预定义的类和方法,供开发者在构建Java应用程序时使用。API文档详细地阐述了这些类、接口、方法和构造函数的功能、用法以及参数说明...
然而,自JDK 1.5开始,随着`java.util.concurrent`包的引入,Java线程池的功能得到了极大的增强,为开发者提供了更加高效且易于管理的线程管理方式。 #### 二、线程池的作用与必要性 线程池的主要功能在于限制系统...
高级实用工具类是`java.util.concurrent`的核心,包括线程安全集合(如ConcurrentHashMap、CopyOnWriteArrayList等)、线程池(ExecutorService、ThreadPoolExecutor、ScheduledThreadPoolExecutor等)、信号...
8. **并发和多线程**:OpenJDK8的源码中,`java.util.concurrent`包下包含了丰富的并发工具类,如`ExecutorService`, `Semaphore`, `CountDownLatch`等,以及线程池的实现`ThreadPoolExecutor`。 9. **Garbage ...
此外,backport-util-concurrent还实现了`ExecutorService`和`ThreadPoolExecutor`,这是Java 5中的线程池管理框架。`ExecutorService`定义了一组线程执行服务,可以管理和控制并发任务的执行。`ThreadPoolExecutor`...