最近写了一个 HTTP 代理服务器发现访问网页时建立的连接很多消耗的线程也非常的多对于系统是一个不小的开销而且这些线程存在的时间都很短%以上的线程存在的时间都在毫秒的等级相对来说线程的建立的注销就占了绝大部分的CPU时间 一个很小的线程池 代码如下(一共个类): /* *一个简单的线程池 ThreadPool java */ public class ThreadPool { //以下是配置信息可以更改 static int MAX_THREAD = ; //未使用 static int MIN_THREAD = ; static int id = ; //线程 ID 号主要用于监视线程的工作情况 static private ThreadPool pool = new ThreadPool(); static public ThreadPool getThreadPool() { return pool; } Stack<WorkThread> stack = new Stack<WorkThread>(MIN_THREAD); private ThreadPool() { } synchronized public boolean putWorkThread(WorkThread wt) { if(stacksize()<MIN_THREAD){ stackpush(wt); return true; } else { return false; } } synchronized public WorkThread getWorkThread() { WorkThread wt = null; if(stackisEmpty()) { wt = new WorkThread(this); new Thread(wt线程ID:+id)start(); id++; } else { wt = stackpop(); } return wt; } }
/* *工作线程类 WorkThreadjava */ public class WorkThread implements Runnable { Object lock = new Object(); Runnable runner = null; ThreadPool pool = null; public WorkThread(ThreadPool pool) { thispool = pool; } public void start(Runnable r) { runner = r; synchronized(lock) { locknotify(); } } public void run() { while(true) { if(runner != null) { runnerrun(); runner = null; //及时回收资源 } if(poolputWorkThread(this)) { Systemoutprintln (ThreadcurrentThread()getName()+ 被回收!); synchronized(lock) { try { lockwait(); } catch (InterruptedException ie) { Systemoutprintln (停止线程时出现异常); } } } else { Systemoutprintln (ThreadcurrentThread()getName()+ 被丢弃!); break; } } } } 使用方法: Runnable r = ; new Thread(r)start(); 这是你以前的代码使用线程池只需要将后一句变成 ThreadPoolgetThreadPool()getWorkThread()start(r); 就可以了其他的代码不用任何更改 这个线程池还有两个功能没有实现 最大线程数的控制 空闲线程等待一定时间后自动注销 但这个线程池也有一个好处可以随时改变最小线程的数量 |