黑马程序员技术交流社区
标题:
关于线程池的问题!!
[打印本页]
作者:
马云
时间:
2012-3-29 19:46
标题:
关于线程池的问题!!
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
为什么有的任务没有执行到呢。??求大师解!
作者:
黑马张平
时间:
2012-3-29 22:16
这个还是看不懂。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2