- 浏览: 351719 次
- 性别:
- 来自: 成都正在项目
文章分类
- 全部博客 (121)
- Java-Spring (1)
- Java-Hibernate (5)
- Java-基础 (16)
- Java-中级 (1)
- Java-高级 (18)
- Java-Struts (0)
- Java-RCP/Swing/SWT/JFACE (1)
- Java-常用正则 (1)
- Java-反射 (2)
- Java-h2database (2)
- JAVA面试题目 (1)
- ArcGIS Desktop 10——安装篇 (2)
- ArcGIS Desktop 10——基本知识 (0)
- ArcGIS Desktop 10——专业库——数据管理 (9)
- PHP——安装篇 (3)
- PHP——基础篇 (2)
- PHP——教程笔记 (10)
- GIS——基础 (3)
- GIS——算法 (0)
- GIS——Geoserver (1)
- GIS——OpenLayers (1)
- C#——既然改成了ITEYE我就增加个栏目 (1)
- Oracle——PL/SQL (1)
- Oracle——Java基础 (2)
- Oracle——TOAD (1)
- ECLIPSE-MYECLIPSE常见问题 (3)
- MySQL——安装篇 (4)
- Postgres (5)
- JavaScript - JQUERY (2)
- C++ (2)
- 操作系统 (5)
- Dwr——DirectWebRemoting (5)
- Maven (1)
- FLEX (4)
- ruby (1)
最新评论
-
AXthrough:
好强大,支持。
解决Jquery.autocomplete.js多参数的正确传递+中文编码+发送兼容FF+空格问题+返回值 -
redsky008:
独立的程序,独立的路径。
我已经转行了,以后这个很少关注的了 ...
真正解决 log4j:ERROR Failed to rename错误解决办法 -
梅花簪:
没明白,怎么改配置,为不同的进程所有?
真正解决 log4j:ERROR Failed to rename错误解决办法
import java.util.LinkedList;
public class ThreadPool extends ThreadGroup {
private boolean isClosed=false; //线程池是否关闭
public LinkedList<Runnable> workQueue; //表示工作队列
private static int threadPoolID; //表示线程池ID
private int threadID; //表示工作线程ID
public ThreadPool(int poolSize) { //poolSize指定线程池中的工作线程数目
super("ThreadPool-" + (threadPoolID++));
setDaemon(true);
workQueue = new LinkedList<Runnable>(); //创建工作队列
for (int i=0; i<poolSize; i++)
new WorkThread().start(); //创建并启动工作线程
}
/** 向工作队列中加入一个新任务,由工作线程去执行该任务 */
public synchronized void execute(Runnable task) {
if (isClosed) { //线程池被关则抛出IllegalStateException异常
throw new IllegalStateException();
}
if (task != null) {
workQueue.add(task);
notify(); //唤醒正在getTask()方法中等待任务的工作线程
}
}
/** 从工作队列中取出一个任务,工作线程会调用此方法 */
protected synchronized Runnable getTask()throws InterruptedException{
while (workQueue.size() == 0) {
if (isClosed) return null;
wait(); //如果工作队列中没有任务,就等待任务
}
return workQueue.removeFirst();
}
/** 关闭线程池 */
public synchronized void close() {
if (!isClosed) {
isClosed = true;
workQueue.clear(); //清空工作队列
interrupt(); //中断所有的工作线程,该方法继承自ThreadGroup类
}
}
/** 等待工作线程把所有任务执行完 */
public void join() {
synchronized (this) {
isClosed = true;
notifyAll(); //唤醒还在getTask()方法中等待任务的工作线程
}
Thread[] threads = new Thread[activeCount()];
//enumerate()方法继承自ThreadGroup类,获得线程组中当前所有活着的工作线程
int count = enumerate(threads);
for (int i=0; i<count; i++) { //等待所有工作线程运行结束
try {
threads[i].join(); //等待工作线程运行结束
System.out.println("已完成一个任务!!");
}catch(InterruptedException ex) { }
}
}
/** 内部类:工作线程 */
private class WorkThread extends Thread {
public WorkThread() {
//加入到当前ThreadPool线程组中
super(ThreadPool.this,"WorkThread-" + (threadID++));
}
public void run() {
while (!isInterrupted()) { //isInterrupted()方法继承自Thread类,判断线程是否被中断
Runnable task = null;
try { //得到任务
task = getTask();
}catch (InterruptedException ex){}
// 如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程
if (task == null) return;
try { //运行任务,捕获异常
task.run();
} catch (Throwable t) {
t.printStackTrace();
}
}//#while
}//#run()
}//#WorkThread类
}
public class ThreadPool extends ThreadGroup {
private boolean isClosed=false; //线程池是否关闭
public LinkedList<Runnable> workQueue; //表示工作队列
private static int threadPoolID; //表示线程池ID
private int threadID; //表示工作线程ID
public ThreadPool(int poolSize) { //poolSize指定线程池中的工作线程数目
super("ThreadPool-" + (threadPoolID++));
setDaemon(true);
workQueue = new LinkedList<Runnable>(); //创建工作队列
for (int i=0; i<poolSize; i++)
new WorkThread().start(); //创建并启动工作线程
}
/** 向工作队列中加入一个新任务,由工作线程去执行该任务 */
public synchronized void execute(Runnable task) {
if (isClosed) { //线程池被关则抛出IllegalStateException异常
throw new IllegalStateException();
}
if (task != null) {
workQueue.add(task);
notify(); //唤醒正在getTask()方法中等待任务的工作线程
}
}
/** 从工作队列中取出一个任务,工作线程会调用此方法 */
protected synchronized Runnable getTask()throws InterruptedException{
while (workQueue.size() == 0) {
if (isClosed) return null;
wait(); //如果工作队列中没有任务,就等待任务
}
return workQueue.removeFirst();
}
/** 关闭线程池 */
public synchronized void close() {
if (!isClosed) {
isClosed = true;
workQueue.clear(); //清空工作队列
interrupt(); //中断所有的工作线程,该方法继承自ThreadGroup类
}
}
/** 等待工作线程把所有任务执行完 */
public void join() {
synchronized (this) {
isClosed = true;
notifyAll(); //唤醒还在getTask()方法中等待任务的工作线程
}
Thread[] threads = new Thread[activeCount()];
//enumerate()方法继承自ThreadGroup类,获得线程组中当前所有活着的工作线程
int count = enumerate(threads);
for (int i=0; i<count; i++) { //等待所有工作线程运行结束
try {
threads[i].join(); //等待工作线程运行结束
System.out.println("已完成一个任务!!");
}catch(InterruptedException ex) { }
}
}
/** 内部类:工作线程 */
private class WorkThread extends Thread {
public WorkThread() {
//加入到当前ThreadPool线程组中
super(ThreadPool.this,"WorkThread-" + (threadID++));
}
public void run() {
while (!isInterrupted()) { //isInterrupted()方法继承自Thread类,判断线程是否被中断
Runnable task = null;
try { //得到任务
task = getTask();
}catch (InterruptedException ex){}
// 如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程
if (task == null) return;
try { //运行任务,捕获异常
task.run();
} catch (Throwable t) {
t.printStackTrace();
}
}//#while
}//#run()
}//#WorkThread类
}
发表评论
-
RESTEasy 例子 hello world(两种方法)
2012-12-14 17:41 21865转载自http://zorro.blog.51cto.com/ ... -
原来Junit不支持多线程测试,需要使用GroboUtils才可以支持多线程测试
2011-12-06 09:30 1950对Junit的不深刻理解,造成多线程执行不完整,比如执行100 ... -
java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloa
2011-07-29 10:07 1273在做RESTful测试时,在Windows系统下出现了如下问题 ... -
转:Mina2 Http server
2011-07-27 14:03 1047http://amozon.iteye.com/blog/32 ... -
Base64测试
2011-06-29 17:36 1package com.redsky.cn.test; ... -
转Java集群好网站
2011-06-28 22:11 717http://www.jdon.com/jivejdon/th ... -
转:常见NIO开源框架(MINA、xSocket)学习 2
2011-06-23 18:17 841http://unbounder.iteye.com/blog ... -
test
2011-06-23 16:50 544http://www.liuyangs.info/docume ... -
转:直接用socket的话,mina server就不能用filter
2011-06-23 16:00 1转:http://www.blogjava.net/cresp ... -
转:模拟Mina2的TextLineCodecFactory中的TextLineDecoder解码器
2011-06-21 21:50 2001转自:http://hi.baidu.com/huahua03 ... -
转Java NIO文件操作
2011-06-21 13:54 907http://download.csdn.net/source ... -
搜集的一篇OutOfMemoryError
2011-06-10 23:29 1967最近遇到如下问题,主要是在做线程池+数据库连接池时遇到的,虽然 ... -
转载Socket解包
2011-05-31 20:04 1836http://liuyuyuan.iteye.com/blog ... -
Java解决常见验证码——一定是准确率100%
2011-05-28 21:30 1146绝对不适合于严重扭曲,形状交叉的情形。有别于传统切图(一般4张 ... -
Mina2和Spring(2.5)在web项目中的结合使用
2011-05-18 20:55 783转载http://yanda20056.blog.163.co ... -
学习动态代理的时候,原来JAVA代码中也可以编译代码执行JAVAC的功能啊
2011-05-04 22:37 1026JDK1.6提供了如题的功能,前提是项目必须引入JDK1.6而 ... -
关于Map接口中Key值是对象还是值的问题
2011-04-28 19:24 3653今天遇到取不出Key所对应的值,取值为null. 原来是Key ... -
深度克隆对象
2011-04-28 15:10 1024必须将对象序列和反序列, 而且尤其在多线程中要引用多个对象,而 ... -
转载:JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
2011-04-28 15:04 811将封装的如下方法置顶 public static Thr ...
相关推荐
线程池是一种多线程处理形式,它将预先创建好的一组线程维护在一个池中,以便重复使用,而不是每次需要时都创建新的线程。这种技术可以有效地管理和控制并发执行的任务,提高系统的性能和资源利用率。 在“线程池...
C++11是C++语言的一个重要版本更新,它引入了大量的新特性,其中包括对多线程的支持。线程池(ThreadPool)是一种管理线程资源的有效方式,它在现代并发编程中扮演着至关重要的角色。线程池允许程序预先创建一组线程...
线程池ThreadPool。
Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它可以帮助我们有效地管理和控制并发执行的任务,从而提高系统的效率和稳定性。线程池通过复用已存在的线程,避免了频繁创建和销毁线程带来的开销,同时也...
线程池(ThreadPool)是多线程编程中的一个重要概念,它是一种线程使用模式,用于高效地管理和调度线程资源。在C++中实现线程池可以帮助开发者优化并发执行的任务,减少线程创建和销毁的开销,提高系统效率。下面...
一个c实现的线程池threadpool-0.1,有测试代码 This is an implementation for the following requirements: http://paul.rutgers.edu/~csgates/CS416/proj2/index.html Reports of successful use are ...
- **线程池**:是一组预创建的线程,它们共享一个工作队列,等待分配的任务被添加到队列中。线程池中的线程会自动从队列中取出任务并执行,当所有线程都在执行任务时,新任务会被放入队列等待。 2. **DELPHI线程池...
线程池(ThreadPool)是一种多线程编程的高级管理机制,它通过预先创建一组线程并维护一个线程集合,来高效地处理并发任务。在Windows API中,线程池被广泛使用,提供了诸如CreateThreadPool、CloseThreadPool、...
ThreadPool 线程池管理单元 带调用例子
Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它是多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效控制运行的线程数量,如果线程数量超过了最大数量,...
它维护一个线程列表,当有新的任务到来时,会从空闲线程中选择一个来执行任务,如果所有线程都在忙,那么任务会被放入一个等待队列。 2. **任务队列**:任务队列用来存放待执行的任务,通常是一个先进先出(FIFO)...
当一个任务被提交到线程池时,线程池会自动选择一个空闲线程来执行任务,而不是每次都创建新的线程,这可以减少线程创建和销毁的开销。线程池还可以根据需要动态调整线程数量,以适应系统负载的变化。 VC++线程池的...
线程池ThreadPool是指一个池子中包含多个线程的集合,用于管理和维护多个线程的生命周期,提高系统的并发处理能力和响应速度。 了解线程池ThreadPool的原理和使用是Android开发者必须掌握的知识点。下面将详细讲解...
1. 线程池的创建:创建一个ThreadPool实例,通过ThreadPool类的构造函数,可以设置工作线程数量(num_workers),任务队列大小(q_size),结果队列大小(resq_size),以及轮询超时时间(poll_timeout)。...
2. **任务分配**:当一个 Trigger 触发时,调度器会从线程池中选择一个空闲线程,分配给 Job 执行。如果所有线程都在忙碌,新的 Trigger 将被暂时挂起,等待线程池中有线程可用。 3. **任务执行**:线程执行 ...
当有新的任务到来时,线程池会从待命的线程中选择一个来执行任务,而不是每次都创建新的线程,这样可以避免频繁创建和销毁线程带来的开销。任务队列是线程池的核心组成部分,用于存储待处理的任务,线程从队列中取出...
线程池API是微软.NET Framework中的一个重要组成部分,它在`System.Threading`命名空间下提供了一系列高效、可管理的多线程编程接口。线程池的主要目的是优化系统资源的使用,减少线程创建和销毁的开销,提高系统的...
main函数中,首先创建了一个设备列表device_list,接着创建了一个拥有8个线程的线程池ThreadPool。通过遍历设备列表,我们为每个设备创建了相应的任务请求,并将这些任务请求添加到request_list中。然后通过map函数...
线程池的工作原理是预先创建一组线程,当需要执行任务时,它会从池中分配一个空闲线程,而不是每次都创建新的线程。这样可以减少线程创建和销毁的开销,因为创建和销毁线程是相对昂贵的操作。线程池还可以根据需要...
下面的例子中,我们有一个并行流,这个并行流使用了一个自定义的线程池去计算1到 1,000,000的和。 知识点:可以使用ForkJoinPool的构造方法并设定并行级别来创建一个自定义的线程池。 4. 总结 我们简要地看了一下...