JAVA爲多線程場景提供了線程池,下面是一個線程池的構造方法:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), handler);
}
其中這些參數的使用和說明在我的一篇文章中已經有了介紹,如果不太清楚的可以參考這篇文章:http://blog.csdn.net/jgteng/article/details/54409887
這裏想對拒絕策略RejectedExecutionHandler做一下詳細的介紹。
在使用線程池並且使用有界隊列的時候,如果隊列滿了,任務添加到線程池的時候就會有問題,針對這些問題java線程池提供了以下幾種策略:
- AbortPolicy
- DiscardPolicy
- DiscardOldestPolicy
- CallerRunsPolicy
- 自定義
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
//不做任何處理,直接拋出異常
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
//就是一個空的方法
}
◇DiscardOldestPolicy
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
//移除隊頭元素
e.getQueue().poll();
//再嘗試入隊
e.execute(r);
}
}
CallerRunsPolicy
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
//直接執行run方法
r.run();
}
}
自定義
public class MyRejectPolicy implements RejectedExecutionHandler{
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
//Sender是我的Runnable類,裏面有message字段
if (r instanceof Sender) {
Sender sender = (Sender) r;
//直接打印
System.out.println(sender.getMessage());
}
}
}