一个比较简单的线程池至少应包括
线程池管理器:创建、销毁并管理线程池,将工作线程放入线程池中;
工作线程:一个可以循环执行任务的线程,在没有任务时进行等待;
任务队列:提供一种缓冲机制,将没有处理的任务放在任务队列中;
任务接口:每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等。 工作线程通过该接口调度任务的执行。
类似于操作系统中的缓冲区,流程如下:
先启动若干数量的线程,并让这些线程都处于等待状态,当客户端有一个新请求时,就会唤醒线程池中的某一个等待线程,让他来处理客户端的这个请求,当处理完后,继续处于等待状态。
ThreadPoolManager类: 管理线程池,初始化线程池,并为客户端请求分配不同的线程来处理;
SimpleThread类:Thread类的一个子类,对客户端请求进行处理的类,初始化时均为睡眠状态,若接收到ThreadPoolManager的调度,则会唤醒线程。
package thread;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class threadpool {
static class ThreadPoolManager{
private int MaxThread;
private Vector ThreadQueue;
public void setMaxThread(int count){
this.MaxThread=count;
}
public ThreadPoolManager(int count){
setMaxThread(count);
System.out.println("Starting Thread Pool");
ThreadQueue=new Vector();
for(int i=0;i<=MaxThread;i++){
SimpleThread thread=new SimpleThread(i);
ThreadQueue.addElement(thread);
thread.start();
}
}
public void process(String argument){
int i;
for(i=0;i<ThreadQueue.size();i++){
SimpleThread current=(SimpleThread) ThreadQueue.elementAt(i);
if(!current.isRunning()){
System.out.println("Thread"+(i+1)+"is processing:"+argument);
current.setArgument(argument);
current.setRunning(true);
return;
}
}
if(i==ThreadQueue.size()){
System.out.println("pool is full,try in anthor time");
}
}
}
static class SimpleThread extends Thread{
private boolean RunningFlag;
private String argument;
public boolean isRunning(){
return RunningFlag;
}
public synchronized void setRunning(Boolean Flag){
RunningFlag=Flag;
if(Flag){
this.notify();
}
}
public String getArgument(){
return this.argument;
}
public void setArgument(String string){
argument=string;
}
public SimpleThread(int threadNumber){
RunningFlag=false;
System.out.println("thread"+threadNumber+"started.");
}
public synchronized void run(){
try {
while(true){
if(!RunningFlag){
this.wait();
}
else{
System.out.println("process"+getArgument()+"……done!");
sleep(5000);
System.out.println("Thread is sleeping.");
setRunning(false);
}
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("Interrupt");
}
}
}
public static void main(String[] args) {
try {
BufferedReader brBufferedReader=new BufferedReader(new InputStreamReader(System.in));
String string;
ThreadPoolManager manager=new ThreadPoolManager(10);
while((string=brBufferedReader.readLine())!=null){
manager.process(string);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}