Java线程池

1. 线程池的开销

线程池尽在任务期限相当短但是才会发挥作用。完成特定文件请求的HTTP服务器就是这样的一项典型的任务,这类任务最好用线程池完成,而且运行的时间不会很长。对于那些无限期运行的任务,使用普通线程技术是更好的选择。

2.线程池的实现

线程池管理器:创建、校徽并管理线程池,在没有任务时进行等待;

任务队列:提供一种缓冲机制,将没有处理的任务放在任务队列中;

任务接口:规定任务的入口、任务执行完后的收尾工作、任务执行的状态等;

工作线程:通过任务接口执行调度任务。

package web;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Vector;

public class ThreadPoolManager {//线程池管理类
	private int maxThread;//线程池的最大容量
	public Vector vector;//存放的线程对象
	public void setMaxThread(int threadCount){
		maxThread=threadCount;
	}
	public ThreadPoolManager(int threadCount){
		setMaxThread(threadCount);
		System.out.println("Starting thread pool...");
		vector=new Vector();
		
		for(int i=1;i<=10;i++){
			SimpleThread thread=new SimpleThread(i);//创建工作线程
			vector.addElement(thread);//将创建的线程放入池中
			thread.start();//启动线程
		}
	}
	//线程池对线程的管理
	public void process(String argument){
		int i;
		for(i=0;i<vector.size();i++){
			SimpleThread currentThread=(SimpleThread)vector.elementAt(i);
			if(!currentThread.isRunning()){
				System.out.println("Thread"+(i+1)+"is processing:"+argument);
				currentThread.setArgument(argument);
				return;
			}
		}
		if(i==vector.size())//线程池已满,需要等待
			System.out.println("pool is full, try in another time.");
	}
}


package web;

public 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("processing "+getArgument()+"...done.");
					sleep(1000);
					System.out.println("Thread is sleeping...");
					setRunning(false);
				}
			}
		}catch(InterruptedException e){
			System.out.println("InterruptException");
		}
	}
}

package web;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class TestThreadPool{//线程池测试类
	public static void main(String[] args){
		try{
			BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
			String s;
			//创建具有10个线程容量的线程池
			ThreadPoolManager manager=new ThreadPoolManager(10);
			while((s=br.readLine())!=null){
				manager.process(s);//处理用户的输入需求
			}
		}catch(IOException e){
			System.out.println("IOException");
		}
	}
}


你可能感兴趣的:(Java线程池)