/**
* 2010-8-3 下午09:14:29
* @auth cjj
*/
package org.prime.threadpool;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author cjj
*
*/
public class CPrimePool {
private Object lock = new Object();
private volatile boolean stop = false;
private int coreSize;
private int maxSize;
private AtomicInteger curThreadCount = new AtomicInteger();
private Queue<WorkThread> cacheThreads = new ConcurrentLinkedQueue<WorkThread>();
public CPrimePool() {
init();
}
public CPrimePool(int coreSize, int maxSize) {
this.coreSize = coreSize;
this.maxSize = maxSize;
init();
}
private void init() {
if (coreSize == 0) {
coreSize = 1;
}
if (maxSize == 0) {
maxSize = Runtime.getRuntime().availableProcessors() + 1;
}
}
public void runTask(Runnable task) {
if (!stop) {
if (curThreadCount.get() < coreSize) {
WorkThread work = new WorkThread();
int i = curThreadCount.getAndIncrement();
work.setName("Work Thread : "+i);
work.start();
work.setTask(task);
} else {
WorkThread work = cacheThreads.poll();
if (work != null) {
work.setTask(task);
} else {
if (curThreadCount.get() < maxSize) {
work = new WorkThread();
int i = curThreadCount.getAndIncrement();
work.setName("Work Thread : "+i);
work.start();
work.setTask(task);
} else {
synchronized (lock) {
while ((work = cacheThreads.poll()) == null
&& !stop) {
try {
lock.wait();
} catch (InterruptedException e) {
// ignore
}
}
}
if (!stop) {
work.setTask(task);
}
}
}
}
}
}
public void stop() {
stop = true;
WorkThread work = null;
while ((work = cacheThreads.poll()) != null) {
work.interrupt();
}
}
private class WorkThread extends Thread {
private Runnable task;
public void setTask(Runnable task) {
synchronized (this) {
this.task = task;
notifyAll();
}
}
@Override
public void run() {
while (!stop) {
try {
if (task != null) {
task.run();
}
synchronized (lock) {
task = null;
// 回收
cacheThreads.add(this);
lock.notifyAll();
}
synchronized (this) {
while (task == null && !stop) {
wait();
}
}
} catch (InterruptedException ie) {
break;
}
}
}
}
}
使用示例代码:
/**
* 2010-8-3 下午11:31:28
* @auth cjj
*/
package org.prime.threadpool.test;
import org.prime.threadpool.CPrimePool;
/**
* @author cjj
*
*/
public class Test {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
CPrimePool pool = new CPrimePool();
for (int i = 0; i < 500000; i++) {
pool.runTask(new MyThread(i));
}
// Thread.sleep(30000);
pool.stop();
}
static class MyThread implements Runnable {
private int i;
public MyThread(int i) {
this.i = i;
}
@Override
public void run() {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
System.out.println("thread:" + i);
}
}
}
}
分享到:
相关推荐
java中MVC与LookAndFeel类及自创界面(更新)
然后我将Javasc代码用Java改写了,并且用mysql建了数据库表,进行了测试,可以处理一些简单的流程。我觉得代码很有学习参考价值,所以上传到这里,希望对大家有些帮助,里面附上html文件是Javascript写的工作流引擎...
java中MVC与LookAndFeel类及自创界面
自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版...
这是我的在南京的同学整理出来的java面试经验 包含现在公司问到较多的笔试题和面试题
北京化工大学2009级学生java作业 详细代码,完美打包,附加jarruner
c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子...
自创打包工具指引
c语言自创军旗游戏源码.rarc语言自创军旗游戏源码.rarc语言自创军旗游戏源码.rarc语言自创军旗游戏源码.rar
java 连接数据库 lookandfeel java网络编程 java 连接3大数据库,各种风格的窗口主题,C/S版的java网络编程 java 举例(源代码)
我自制的Java集合概述与实例分析PPT,包含了Java中集合的常见类型介绍,常用方法,底层实现形式以及一个利用集合能够很好解决问题的自创例子。
美萍库存管理系统(源代码和数据库自创的哦!) 美萍库存管理系统(源代码和数据库自创的哦!)
高德自创天气png图标
易语言自创对称加密算法
我的作品 自创 我的作品 自创 我的作品 自创 我的作品 自创 我的作品 自创 我的作品 自创
java 五子棋设计方案,该项目为经典版本的五子棋游戏和自创的毁灭玩法所结合,总体而言是一个休闲的小游戏。其中的规则不难,主要是为了丰富大家的文娱生活,让大家在忙碌的学习课后可以轻松一小下。这就是本程序的...
unit 4 知识点、语法、思维导图归纳(自创).pdfunit 4 知识点、语法、思维导图归纳(自创).pdfunit 4 知识点、语法、思维导图归纳(自创).pdfunit 4 知识点、语法、思维导图归纳(自创).pdfunit 4 知识点、语法、思维...
wifi密码破解,(非原创)自创哦
本人亲自编写的基于均值法,中值法,和自创改进均值法的图像去噪源程序,仍需要改进的地方是:没有创建线程处理矩阵输出,程序处理大图片时速度很慢。如果不输出矩阵速度很快。如有需要自行修改。谢谢!