现在服务器端的应用程序几乎都采用了线程池技术这主要是为了提高系统效率因为如果服务器对应每一个请求就创建一个线程的话在很短的一段时间内就会产生很多创建和销毁线程动作导致服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多线程池就是为了尽量减少这种情况的发生
下面我们来看看怎么用Java实现一个线程池一个比较简单的线程池至少应包含线程池管理器工作线程任务队列任务接口等部分其中线程池管理器(ThreadPool Manager)的作用是创建销毁并管理线程池将工作线程放入线程池中工作线程是一个可以循环执行任务的线程在没有任务时进行等待任务队列的作用是提供一种缓沖机制将没有处理的任务放在任务队列中任务接口是每个任务必须实现的接口主要用来规定任务的入口任务执行完后的收尾工作任务的执行状态等工作线程通过该接口调度任务的执行
一种就是以固定线程数目作为基准让每一个线程的工作线程都处于无限循环中利用Java中基类的nodify()与wait()进行协同工作
基本思想如下
在构建线程池的时候创建所有工作线程并且让所有工作线程开始运行
public ThreadPool(int nPoolSize)
{
if(nPoolSize<=)
{
nPoolSize=DEFAULT_POOL_SIZE;
}
m_ThreadList=new ArrayList();
m_RunList=new LinkedList();
for(int i=;i<nPoolSize;i++)
{
WorkerThread temp=new WorkerThread(i+);
m_ThreadListadd(temp);
tempstart();
}
}
在工作线程的run()方法中用wait()进行等待当线程处于wait()状态基本不占用CPU这样所有工作线程都处于挂起状态等待任务来唤醒
实现如下
while (true)
{
synchronized (m_RunList)
{
while (m_RunListisEmpty())
{
//任务列表为空则进行等待否则运行任务并在本任务列表里面剔除任务
try
{
m_RunListwait();
}
catch (InterruptedException e) {}
}
r = (Runnable) m_RunListremoveFirst();
file://Systemoutprintln(m_nThreadID + :Start);
if (r == null)return;
}
try
{
rrun();
}
catch (Exception e) {}
}
以上代码就是一个工作线程主要代码这个线程永远不会停止只可能被挂起或者运行任务