一个完整的线程池的实例

线程池用一个双向链表来表示,池中的元素是处于休眠状态的工作线程。ThreadPool类大部分工作都是来维护这个双向链表,当有新的请求到达时,先从表头摘取一个工作线程,将其唤醒转入工作状态。如果线程池为空,则创建一个新的工作线程。
/**
* free software
* from apusic
* by www.cn-java.com 2001
*/
import java.util.LinkedList;

public class ThreadPool
{
static final long IDLE_TIMEOUT = 60000L;

private String name;
private int minsize;
private int maxsize;
private int nextWorkerId = 0;
private LinkedList pool = new LinkedList();

public ThreadPool() {
this("PooledThread");
}

public ThreadPool(String name) {
this(name, 0, 20);
}

public ThreadPool(String name, int minsize, int maxsize) {
this.name = name;
this.minsize = minsize;
this.maxsize = maxsize;
}

public synchronized void run(Runnable runner) {
Worker worker;

if (runner == null) {
throw new NullPointerException();
}

// get a worker from free list...
if (!pool.isEmpty()) {
worker = (Worker) pool.removeFirst();
} else {
// ...no free worker available, create new one...
worker = new Worker(name + "-" + ++nextWorkerId);
worker.start();
}

// ...and wake up worker to service incoming runner
worker.wakeup(runner);
}

// Notified when a worker has idled timeout
// @return true if worker should die, false otherwise
synchronized boolean notifyTimeout(Worker worker) {
if (worker.runner != null) {
return false;
}
if (pool.size() > minsize) {
// Remove from free list
pool.remove(worker);
return true; // die
}
return false; // continue
}

// Notified when a worker has finished his work and
// free to service next runner
// @return true if worker should die, false otherwise
synchronized boolean notifyFree(Worker worker) {
if (pool.size() < maxsize) {
// Add to free list
pool.addLast(worker);
return false; // continue
}
return true; // die
}

// The inner class that implement worker thread
class Worker extends Thread {
Runnable runner = null;

public Worker(String name) {
super(name);
}

synchronized void wakeup(Runnable runner) {
this.runner = runner;
notify();
}

public void run() {
for (;;) {
synchronized (this) {
if (runner == null) {
try {
wait(IDLE_TIMEOUT);
} catch (InterruptedException e) {}
}
}

// idle timed out, die or put into free list
if (runner == null) {
if (notifyTimeout(this))
return;
else
continue;
}

try {
runner.run();
} finally {
runner = null;
if (notifyFree(this))
return;
}
}
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值