码迷,mamicode.com
首页 > 编程语言 > 详细

线程池的简单实现

时间:2014-06-02 04:10:21      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:线程池

package com.mzsx.concurrent.threadpool;
import java.util.List;
import java.util.Vector;
public class ThreadPool {
 private static ThreadPool instance=null;
 //空闲的线程队列
 private List<PThread> idleThreads;
 //已有的线程总数
 private int threadCounter;
 private boolean isShutdown;
 
 private ThreadPool(){
  this.idleThreads=new Vector<PThread>(5);
  threadCounter=0;
 }
 
 public int getCreatedThreadsCount(){
  return threadCounter;
 }
 //取得线程池的实例
 public synchronized static ThreadPool getInstance(){
  if (instance==null) {
   instance=new ThreadPool();
  }
  return instance;
 }
 
 //放入线程池
 protected synchronized void repool(PThread repoolingThread){
  if (!isShutdown) {
   idleThreads.add(repoolingThread);
  }else{
   repoolingThread.shutdown();
  }
  
 }
 
 //停止线程池中所有的线程
 public synchronized void shutDown(){
  isShutdown=true;
  for (int i = 0; i < idleThreads.size(); i++) {
   PThread idleThread=(PThread)idleThreads.get(i);
   idleThread.shutdown();
  }
  
 }
 //执行任务
 public synchronized void start(Runnable target){
  PThread thread=null;
  //如果有空闲的线程,则直接使用
  if (idleThreads.size()>0) {
   int lastIndex=idleThreads.size()-1;
   thread=idleThreads.get(lastIndex);
   //立即执行这个任务
   thread.setTarget(target);
 
  }else {
   threadCounter++;
   //创建新线程
   thread  =new PThread(target, "PThread#"+threadCounter, this);
   thread.start();
  }
 }
}
package com.mzsx.concurrent.threadpool;
public class PThread extends Thread {
 //线程池
 private ThreadPool pool;
 //任务
 private Runnable target;
 private boolean isSHutdown=false;
 private boolean isIdle=false;
 public PThread(Runnable target,String name,ThreadPool pool){
  super(name);
  this.pool=pool;
  this.target=target;
 }
 public ThreadPool getPool() {
  return pool;
 }
 public void setPool(ThreadPool pool) {
  this.pool = pool;
 }
 public Runnable getTarget() {
  return target;
 }
 public synchronized void setTarget(Runnable newTarget) {
  target = newTarget;
  notifyAll();
 }
 public boolean isSHutdown() {
  return isSHutdown;
 }
 public void setSHutdown(boolean isSHutdown) {
  this.isSHutdown = isSHutdown;
 }
 public boolean isIdle() {
  return isIdle;
 }
 public void setIdle(boolean isIdle) {
  this.isIdle = isIdle;
 } 
 @Override
 public void run() {
  //只要没有关闭,则一直不结束该线程
  while(!isSHutdown){
   isIdle=false;
   if (target!=null) {
    //运行任务
    target.run();
   }
   //任务结束,到闲置状态
   isIdle=true;
   try {
    //该线程任务结束后,不关闭线程,而是放入线程池空闲对了
    pool.repool(this);
    synchronized (this) {
     wait();
    }
    
   } catch (Exception e) {
    // TODO: handle exception
   }
   isIdle=false;
  }
 }
 //关闭线程
 public  synchronized void shutdown(){
  isSHutdown=true;
  notifyAll();
 } 
}

 

package com.mzsx.concurrent.threadpool;
public class MyThread implements Runnable {
 protected String name;
 
 public MyThread() {
 }
 public MyThread(String name) {
  super();
  this.name = name;
 }

 @Override
 public void run() {
  try {
   System.out.println(this.name);
   Thread.sleep(1);
  } catch (Exception e) {
   // TODO: handle exception
   e.printStackTrace();
  }
 }
}
package com.mzsx.concurrent.threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //不使用线程池
  /*for (int i = 0; i < 1000; i++) {
   new Thread(new MyThread("MyThread-"+i)).start();
  }*/
  //使用线程池
  /*for (int i = 0; i < 1000; i++) {
   ThreadPool.getInstance().start(new MyThread("MyThread-"+i));
  }*/
  //JDK自带的线程池
  ExecutorService executorService=Executors.newCachedThreadPool();
  for (int i = 0; i < 1000; i++) {
   executorService.execute(new MyThread("MyThread-"+i));
  }
 }
}

 

 

 

 

 

 

 

本文出自 “梦朝思夕” 博客,请务必保留此出处http://qiangmzsx.blog.51cto.com/2052549/1420962

线程池的简单实现,布布扣,bubuko.com

线程池的简单实现

标签:线程池

原文地址:http://qiangmzsx.blog.51cto.com/2052549/1420962

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!