import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class App {
private ThreadPoolExecutor threadpool;
public App(){
/*参数依次是:
corePoolSize - 池中所保存的线程数,包括空闲线程。
maximumPoolSize - 池中允许的最大线程数。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。此队列仅由保持 execute 方法提交的 Runnable 任务。
handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。*/
//规则:
//1. 池中线程数量小于corePoolSize, 即使存在空闲线程,也启动新线程处理新任务;
//2. 池中显成熟等于corePoolSize,则添加至workQueue;
//3. 若此时连workQueue也满,但线程数小于maximumPoolSize, 则添加新线程处理新任务;
//4. 若超过maximumPoolSize 则调用handler 处理
// DiscardOldestPolicy -> 放弃最末的处理请求
threadpool = new ThreadPoolExecutor(2,3, 10, TimeUnit.
SECONDS, new ArrayBlockingQueue(2),
new ThreadPoolExecutor.DiscardOldestPolicy());
}
public void subMit(final int value){
threadpool.execute(new Runnable(){
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(value + "_hello\r\n");
}
});
}
public void shutdown() {
threadpool.shutdown();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
App app = new App();
for(int i = 0; i < 5;i++){
app.subMit(i);
}
//输出:当threadpool = new ThreadPoolExecutor(2,3, 10, TimeUnit.
//SECONDS, new ArrayBlockingQueue(1),
//3_hello
//1_hello
//0_hello
//4_hello
//输出:当threadpool = new ThreadPoolExecutor(2,3, 10, TimeUnit.
//SECONDS, new ArrayBlockingQueue(2),
//0_hello
//1_hello
//4_hello
//3_hello
//2_hello
app.shutdown();
}
}