首页 | 博客群 | 公社 | 专栏 | 论坛 | 图片 | 资讯 | 注册 | 帮助 | 博客联播 | 随机访问
我的未来- -| 回首页 | 2007年索引 | - -吴清源:我一生只做了两件事

初探线程池

关键词线程                                          

近日对线池产生兴趣,在参考更多篇幅后记录下自己的心得如下。
一:线程池的创建和销毁需要开销
二:理解什么是线程池,
三:线程切换这一流程的描述:操作系统将用户模式转换到内核模式;更新当前线程的内核对象;进程调度器通过算法获得下一进程为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;
 }
}

【作者: 黄河】【访问统计:】【2007年08月29日 星期三 18:39】【注册】【打印

搜索

Google

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=6433724

回复

验证码:   
评论内容: