Java 线程池

来源:互联网 发布:pubwin2015的数据库 编辑:程序博客网 时间:2024/06/05 11:23

 

java的线程池是通过HashMap获取当前的线程,保持线程同步
==============================================================

Java多线程为什么使用线程池


1:提高效率 创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,
这要比需要的时候创建一个线程对象要快的多。2:方便管理 可以编写线程池管理代码对池中的线程统一进行管理,
比如说系统启动时由该程序创建100个线程,每当有请求的时候,就分配一个线程去工作, 
如果刚好并发有101个请求,那多出的这一个请求可以排队等候,避免因无休止的创建线程导致系统崩溃
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

JAVA线程池管理的实现

import java.util.LinkedList;import java.util.Queue;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.Executors;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.ScheduledFuture;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;/** * 线程池管理 * @author LW * @date 2011-2-12 */public class ThreadPoolManager {  private static ThreadPoolManager tpm = new ThreadPoolManager(); // 线程池维护线程的最少数量 private final static int CORE_POOL_SIZE = 3; // 线程池维护线程的最大数量 private final static int MAX_POOL_SIZE = 10; // 线程池维护线程所允许的空闲时间 private final static int KEEP_ALIVE_TIME = 0; // 线程池所使用的缓冲队列大小 private final static int WORK_QUEUE_SIZE = 10; // 任务调度周期 private final static int TASK_QOS_PERIOD = 10; // 任务缓冲队列 private Queue<Runnable> taskQueue = new LinkedList<Runnable>(); /*  * 线程池超出界线时将任务加入缓冲队列  */ final RejectedExecutionHandler handler = new RejectedExecutionHandler() {  public void rejectedExecution(Runnable task, ThreadPoolExecutor executor) {   taskQueue.offer(task);  } }; /*  * 将缓冲队列中的任务重新加载到线程池  */ final Runnable accessBufferThread = new Runnable() {  public void run() {   if (hasMoreAcquire()) {    threadPool.execute(taskQueue.poll());   }  } }; /*  * 创建一个调度线程池  */ final ScheduledExecutorService scheduler = Executors   .newScheduledThreadPool(1); /*  * 通过调度线程周期性的执行缓冲队列中任务  */ final ScheduledFuture<?> taskHandler = scheduler.scheduleAtFixedRate(   accessBufferThread, 0, TASK_QOS_PERIOD, TimeUnit.MILLISECONDS); /*  * 线程池  */ final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(   CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,   new ArrayBlockingQueue<Runnable>(WORK_QUEUE_SIZE), this.handler); /*  * 将构造方法访问修饰符设为私有,禁止任意实例化。  */ private ThreadPoolManager() { } /*  * 线程池单例创建方法  */ public static ThreadPoolManager newInstance() {  return tpm; } /*  * 消息队列检查方法  */ private boolean hasMoreAcquire() {  return !taskQueue.isEmpty(); } /*  * 向线程池中添加任务方法  */ public void addExecuteTask(Runnable task) {  if (task != null) {   threadPool.execute(task);  } }}

 

原创粉丝点击