相关举例如下所示:
public class ThreadTest {
private static int produceTaskSleepTime = 2;
// private static int consumeTaskSleepTime = 2000;
private static int produceTaskMaxNumber = 10;
public static void main(String[] args) {
//构建一个线程池
/*
* ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler);
* corePoolSize: 线程池维护线程的最少数量
* maximumPoolSize:线程池维护线程的最大数量
* keepAliveTime: 线程池维护线程所允许的空闲时间
* unit: 线程池维护线程所允许的空闲时间的单位
* workQueue: 线程池所使用的缓冲队列
* handler: 线程池对拒绝任务的处理策略
*/
ThreadPoolExecutor threadPool=new ThreadPoolExecutor(2,4,3,TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3),new ThreadPoolExecutor.DiscardOldestPolicy());
for(int i=1;i<=produceTaskMaxNumber;i++){
try {
//产生一个任务,并将其加入到线程池中
String task="task@"+i;
System.out.println("put "+task);
threadPool.execute(new ThreadPoolTaskTest(task));
//便于观察,等待一段时间
Thread.sleep(produceTaskSleepTime);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class ThreadPoolTaskTest implements Runnable,Serializable{
/**
* 序列号
*/
private static final long serialVersionUID = 1L;
//保存任务所需要的数据
private Object threadPoolTaskData;
private Integer consumeTaskSleepTime=2000;
ThreadPoolTaskTest(Object tasks){
this.threadPoolTaskData=tasks;
}
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;
}
}