关于概念什么的我也是看别人的blog:
http://blog.csdn.net/xiaoxiaohacker/article/details/17525799
http://blog.csdn.net/jeffhtlee/article/details/7851120
http://blog.csdn.net/XSL1990/article/details/18564097
贴上自己的demo:
线程池:
package com.yea.test.thread;
import org.apache.log4j.Logger;
import java.util.concurrent.*;
/**
* User: Circo
* Date: 1/16/14
* Time: 9:10 PM
*/
public class TestThreadPool {
public final Logger logger = Logger.getLogger(TestThreadPool.class);
/**
* 线程池之外的缓冲队列
*/
private LinkedBlockingQueue<Runnable> taskList = new LinkedBlockingQueue<Runnable>();
/**
* 线程池的策略(当池中和缓冲队列中的任务满了时的动作--加入池外的缓冲队列)
* 对于加入池外队列的任务,线程池不会自动加载运行,需要[定时器]的帮助
*/
private RejectedExecutionHandler handler = new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
logger.debug("taskList add " + r.toString());
taskList.put(r);
logger.debug("taskList size=" + taskList.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
/**
* 线程池 执行线程最少为 3,最多为 4,存活时间为 3,单位 秒,缓冲队列为2,策略为自定义
*/
private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 4, 3,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(2),
handler
);
/**
* 定时器 定时执行某个任务
* 这里执行任务:scheduledThread
*/
private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
/**
* 定时器的任务
* 任务为:定时把线程池外的任务拿给线程池去执行
*/
private Runnable scheduledThread = new Runnable() {
@Override
public void run() {
Runnable runnable = taskList.poll();
logger.debug("remove task " + runnable.toString() + "from taskList");
threadPoolExecutor.execute(runnable);
}
};
private void execute() {
//产生15个线程,加入线程池
for (int i = 0; i < 10; i++) {
try {
String task = "task@" + i;
logger.debug("add " + task + " to ThreadPool");
threadPoolExecutor.execute(new Task(task));
//休息0.2秒 便于观察
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//执行定时器任务
//表示:1秒之后运行,每隔2秒执行一次scheduledThread任务
scheduledExecutorService.scheduleAtFixedRate(scheduledThread, 1, 3, TimeUnit.SECONDS);
}
public static void main(String[] args) {
//开始执行
new TestThreadPool().execute();
}
}
任务:
package com.yea.test.thread;
import org.apache.log4j.Logger;
/**
* User: Circo
* Date: 1/16/14
* Time: 9:42 PM
*/
public class Task extends Thread{
private static final Logger logger = Logger.getLogger(Task.class);
public Task(String name) {
this.setName(name);
}
public void run() {
try {
logger.debug("线程-- " + this.getName() + " --开始~");
//随机数0-19 如果等于5就退出循环 结束线程
while (5 != (int) (Math.random() * 20)) {
//睡眠三秒==处理任务
Thread.sleep(2000);
}
logger.debug("线程-- " + this.getName() + " --结束。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果分析: