近日对线池产生兴趣,在参考更多篇幅后记录下自己的心得如下。
一:线程池的创建和销毁需要开销
二:理解什么是线程池,
三:线程切换这一流程的描述:操作系统将用户模式转换到内核模式;更新当前线程的内核对象;进程调度器通过算法获得下一进程为CURRENT进程;线程调度器通过算法获得下一线程为CURRENT线程;刚刚成为CURRENT线程的线程对象刷新主内存,CPU寄存器值;从内核模式转换回用户模式执行新线程.
四:为何需要有线程池这样一种模型,其理由不言自明:资源利用,如果线程切换频繁,会导致杀鸡用牛刀的情况,也就是辛辛苦苦切换到一个线程,却只做一点点事情,又要开始调度下一个了,这样的频繁切换不能发挥线程的优势来。
五:代码实现:1,需要一个存放工作线程的容器:这个容器通常是一个实现同步操作的Vector; 2,工作线程; 3,最好开一个专门后台线程来管理线程存放容器.
下面这个例子将各个类全放在一个文件里了,目的是方便调试。
TestThreadPool类,模拟一次线程调用。开启一个线程池,同时开启一个后台管理线程。
import java.io.*;
import java.util.*;
public class TestThreadPool {
private static final int threadCount = 3; //线程池总数
public static void main(String[] args){
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s ;
ThreadPoolManager manager = new ThreadPoolManager(threadCount);
DamonManger damonManger = new DamonManger(manager);
damonManger.start();
while( (s=br.readLine())!=null ){
manager.process(s);
damonManger.outVector();
}
}catch(IOException e){
}
}
}
//后台线程,用于管理线程池,outVector方法显示线程池的状态
class DamonManger extends Thread{
ThreadPoolManager threadPoolManager;
public DamonManger(ThreadPoolManager threadPoolManager){
System.out.println("后台维护线程已启动!");
this.threadPoolManager = threadPoolManager;
}
public void outVector(){
Vector vector = threadPoolManager.getVectors();
System.out.println("-----------------");
for(int i=0;i<vector.size();i++){
WorkThread workThread =(WorkThread)vector.get(i);
System.out.println(workThread.getName()+" 是否运行:"+workThread.isRun());
}
System.out.println("-----------------");
}
public void run(){
while(true){
//如果已满
if( threadPoolManager.isFull() ){
Vector vector = threadPoolManager.getVectors();
for(int i=0;i<vector.size();i++){
if( ((WorkThread)vector.get(i)).isRun() ){
System.out.println("后台维护线程进行了一次线程池管理!清除闲置线程"+
((WorkThread)vector.get(i)).getName());
((WorkThread)vector.get(i)).setRun(false);
break;
}
}
}
}
}
}
//模拟线程池,从构造方法中初始化池,提供了process方法
class ThreadPoolManager{
private Vector vectors ;
int threadCount=10;
boolean ifFull = false;
public ThreadPoolManager(int size){
setThreadCount(size);
System.out.println("启动线程池.....");
vectors = new Vector();
for(int i = 0;i<=threadCount;i++){
WorkThread thread = new WorkThread(i);
vectors.addElement(thread);
thread.start();
}
}
public void process(String argument){
int i;
for(i=0;i<vectors.size();i++){
WorkThread currentThread = (WorkThread)vectors.elementAt(i);
if( !currentThread.isRun() ){
System.out.println("线程 "+(i+1)+" 处理: "+argument);
currentThread.setArgument(argument);
currentThread.setRun(true);
this.ifFull = false;
return;
}
}
if(i==vectors.size()){
System.out.println(" 池已满,等候中");
this.ifFull = true;
}
}
public boolean isFull(){
return this.ifFull;
}
public int getThreadCount() {
return threadCount;
}
public void setThreadCount(int threadCount) {
this.threadCount = threadCount;
}
public Vector getVectors() {
return vectors;
}
}
//具体的工作线程对象,run方法里简化为只输出一条语句,实际上会做更多的事情
class WorkThread extends Thread{
int thisThreadNumber;
private boolean runFlag ;
private String argument;
public WorkThread(int threadNumber){
this.runFlag = false;
setThisThreadNumber(threadNumber);
System.out.println("线程"+threadNumber+ " 启动");
}
public boolean isRun(){
return this.runFlag;
}
public synchronized void setRun(boolean flag){
this.runFlag = flag;
if(flag)
this.notifyAll();
}
public String getArgument(){
return this.argument;
}
public void setArgument(String arguments){
this.argument = arguments;
}
public void run(){
while(true){
synchronized(this){
if(isRun()){
System.out.println("当前线程名为:"+this.currentThread().getName());
//完成一些工作...
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setRun(false);
}
}
}
}
public int getThisThreadNumber() {
return thisThreadNumber;
}
public void setThisThreadNumber(int thisThreadNumber) {
this.thisThreadNumber = thisThreadNumber;
}
}
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=6433724