- package demo;
- import java.io.Serializable;
- import java.util.concurrent.ArrayBlockingQueue;
- import java.util.concurrent.ThreadPoolExecutor;
- import java.util.concurrent.TimeUnit;
- public class TestThreadPool{
- private static int produceTaskSleepTime=2; //派发任务的间隔时间
- private static int consumeTaskSleepTime=2000; //处理任务的速度
- private static int produceTaskMaxNumber=10; //任务数量
-
- public static void main(String[] args){
- ThreadPoolExecutor threadPool=new ThreadPoolExecutor(
- 2, //池中所保存的线程数,包括空闲线程。
- 4, //池中允许的最大线程数
- 3, //当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
- TimeUnit.SECONDS, // 参数的时间单位
- new ArrayBlockingQueue<Runnable>(3), //执行前用于保持任务的队列。此队列仅由保持 execute 方法提交的 Runnable 任务
- new ThreadPoolExecutor.DiscardOldestPolicy()); //由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
-
- for(int i=1;i<=produceTaskMaxNumber;i++){
- try{
- String task="task@"+i;
- System.out.println("派发任务"+task);
- threadPool.execute(new ThreadPoolTask(task));
- Thread.sleep(produceTaskSleepTime); //发完任务休息时间
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
-
- public static class ThreadPoolTask implements Runnable,Serializable{ //任务接口(一个任务)
- private static final long serialVersionUID = 1907601920449539447L;
- private Object threadPoolTaskData;
- ThreadPoolTask(Object tasks){
- this.threadPoolTaskData=tasks;
- }
- @Override
- public void run() {
- System.out.println("start.."+threadPoolTaskData);
- try{
- Thread.sleep(consumeTaskSleepTime);
- }catch(Exception e){
- e.printStackTrace();
- }
- threadPoolTaskData=null;
- }
-
- public Object getTask(){
- return this.threadPoolTaskData;
- }
- }
- }
复制代码 运行结果:
派发任务task@1
start..task@1
派发任务task@2
start..task@2
派发任务task@3
派发任务task@4
派发任务task@5
派发任务task@6
start..task@6
派发任务task@7
start..task@7
派发任务task@8
派发任务task@9
派发任务task@10
start..task@8
start..task@9
start..task@10
为什么有的任务没有执行到呢。??求大师解! |
|