线程池 java 商城_线程池;java的线程池的实现原理;适用于频繁互动(如电商网站)...

线程池技术正是关注怎样缩短或调整T1,T3时间的技术。从而提高server程序性能的。它把T1,T3分别安排在server程序的启动和结束的时间段或者一些空暇的时间段,这样在server程序处理客户请求时,不会有T1,T3的开销了。

线程池不仅调整T1,T3产生的时间段。并且它还显著降低了创建线程的数目,看一个样例:

如果一个server一天要处理50000个请求,而且每一个请求须要一个单独的线程完毕。在线程池中,线程数通常是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果server不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的server程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。

/** 线程池类。工作线程作为其内部类 **/

import java.util.Collections;

import java.util.Date;

import java.util.LinkedList;

import java.util.List;

import org.apache.log4j.Logger;

/**

* 线程池

* 创建线程池,销毁线程池,加入新任务

*

* @author obullxl

*/

public final class ThreadPool {

private static Logger logger = Logger.getLogger(ThreadPool.class);

private static Logger taskLogger = Logger.getLogger("TaskLogger");

private static boolean debug = taskLogger.isDebugEnabled();

// private static boolean debug = taskLogger.isInfoEnabled();

/* 单例 */

private static ThreadPool instance = ThreadPool.getInstance();

public static final int SYSTEM_BUSY_TASK_COUNT = 150;

/* 默认池中线程数 */

public static int worker_num = 5;

/* 已经处理的任务数 */

private static int taskCounter = 0;

public static boolean systemIsBusy = false;

private static List taskQueue = Collections

.synchronizedList(new LinkedList());

/* 池中的全部线程 */

public PoolWorker[] workers;

private ThreadPool() {

workers = new PoolWorker[5];

for (int i = 0; i < workers.length; i++) {

workers[i] = new PoolWorker(i);

}

}

private ThreadPool(int pool_worker_num) {

worker_num = pool_worker_num;

workers = new PoolWorker[worker_num];

for (int i = 0; i < workers.length; i++) {

workers[i] = new PoolWorker(i);

}

}

public staticsynchronizedThreadPool

getInstance() {

if (instance == null)

return new ThreadPool();

return instance;

}

/**

* 添加新的任务

* 每添加一个新任务。都要唤醒任务队列

* @param newTask

*/

public void addTask(Task newTask) {

synchronized (taskQueue) {

newTask.setTaskId(++taskCounter);

newTask.setSubmitTime(new Date());

taskQueue.add(newTask);

/* 唤醒队列, 開始运行 */

taskQueue.notifyAll();

}

logger.info("Submit Task: "

+ newTask.info());

}

/**

* 批量添加新任务

* @param taskes

*/

public void batchAddTask(Task[] taskes) {

if (taskes == null || taskes.length == 0) {

return;

}

synchronized (taskQueue) {

for (int i = 0; i < taskes.length; i++) {

if (taskes[i] == null) {

continue;

}

taskes[i].setTaskId(++taskCounter);

taskes[i].setSubmitTime(new Date());

taskQueue.add(taskes[i]);

}

/* 唤醒队列, 開始运行 */

taskQueue.notifyAll();

}

for (int i = 0; i < taskes.length; i++) {

if (taskes[i] == null) {

continue;

}

logger.info("Submit Task: "

+ taskes[i].info());

}

}

/**

* 线程池信息

* @return

*/

public String getInfo() {

StringBuffer sb = new StringBuffer();

sb.append("\nTask Queue Size:" + taskQueue.size());

for (int i = 0; i < workers.length; i++) {

sb.append("\nWorker " + i + " is "

+ ((workers[i].isWaiting()) ? "Waiting." : "Running."));

}

return sb.toString();

}

/**

* 销毁线程池

*/

public synchronized void destroy() {

for (int i = 0; i < worker_num; i++) {

workers[i].stopWorker();

workers[i] = null;

}

taskQueue.clear();

}

/**

* 池中工作线程

*

* @author obullxl

*/

private class PoolWorker extends Thread {

private int index = -1;

/* 该工作线程是否有效 */

private boolean isRunning = true;

/* 该工作线程能否够运行新任务 */

private boolean isWaiting = true;

public PoolWorker(int index) {

this.index = index;

start();

}

public void stopWorker() {

this.isRunning = false;

}

public boolean isWaiting() {

return this.isWaiting;

}

/**

* 循环运行任务

* 这或许是线程池的关键所在

*/

public void run() {

while (isRunning) {

Task r = null;

synchronized (taskQueue) {

while (taskQueue.isEmpty()) {

try {

/* 任务队列为空,则等待有新任务增加从而被唤醒 */

taskQueue.wait(20);

} catch (InterruptedException ie) {

logger.error(ie);

}

}

/* 取出任务运行 */

r = (Task) taskQueue.remove(0);

}

if (r != null) {

isWaiting = false;

try {

if (debug) {

r.setBeginExceuteTime(new Date());

taskLogger.debug("Worker

+ "> start execute Task");

if (r.getBeginExceuteTime().getTime()

- r.getSubmitTime().getTime() > 1000)

taskLogger.debug("longer waiting time. "

+ r.info() + ",,time:"

+ (r.getFinishTime().getTime() - r

.getBeginExceuteTime().getTime()));

}

/* 该任务是否须要马上运行 */

if (r.needExecuteImmediate()) {

new Thread(r).start();

} else {

r.run();

}

if (debug) {

r.setFinishTime(new Date());

taskLogger.debug("Worker

+ "> finish task");

if (r.getFinishTime().getTime()

- r.getBeginExceuteTime().getTime() > 1000)

taskLogger.debug("longer execution time. "

+ r.info() + ",,time:"

+ (r.getFinishTime().getTime() - r

.getBeginExceuteTime().getTime()));

}

} catch (Exception e) {

e.printStackTrace();

logger.error(e);

}

isWaiting = true;

r = null;

}

}

}

}

}

/** 任务接口类 **/

package org.ymcn.util;

import java.util.Date;

/**

* 全部任务接口

* 其它任务必须继承訪类

*

* @author obullxl

*/

public abstract class Task implements Runnable {

// private static Logger logger = Logger.getLogger(Task.class);

/* 产生时间 */

private Date generateTime = null;

/* 提交运行时间 */

private Date submitTime = null;

/* 開始运行时间 */

private Date beginExceuteTime = null;

/* 运行完毕时间 */

private Date finishTime = null;

private long taskId;

public Task() {

this.generateTime = new Date();

}

/**

* 任务运行入口

*/

public void run() {

/**

* 相关运行代码

*

* beginTransaction();

*

* 运行过程中可能产生新的任务 subtask = taskCore();

*

* commitTransaction();

*

* 添加新产生的任务 ThreadPool.getInstance().batchAddTask(taskCore());

*/

}

/**

* 全部任务的核心 所以特别的业务逻辑运行之处

*

* @throws Exception

*/

public abstract Task[] taskCore() throws Exception;

/**

* 是否用到数据库

*

* @return

*/

protected abstract boolean useDb();

/**

* 是否须要马上运行

*

* @return

*/

protected abstract boolean needExecuteImmediate();

/**

* 任务信息

*

* @return String

*/

public abstract String info();

public Date getGenerateTime() {

return generateTime;

}

public Date getBeginExceuteTime() {

return beginExceuteTime;

}

public void setBeginExceuteTime(Date beginExceuteTime) {

this.beginExceuteTime = beginExceuteTime;

}

public Date getFinishTime() {

return finishTime;

}

public void setFinishTime(Date finishTime) {

this.finishTime = finishTime;

}

public Date getSubmitTime() {

return submitTime;

}

public void setSubmitTime(Date submitTime) {

this.submitTime = submitTime;

}

public long getTaskId() {

return taskId;

}

public void setTaskId(long taskId) {

this.taskId = taskId;

}

}

转自:http://hi.baidu.com/obullxl/blog/item/ee50ad1ba8e8ff1f8718bf66.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值