码迷,mamicode.com
首页 > 编程语言 > 详细

线程池

时间:2018-09-17 16:17:31      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:rgs   rate   资源   抛出异常   拒绝策略   简单的   time   name   .sh   

示例:

public class CustomThreadPoolExecutor {
//private static volatile ThreadPoolExecutor pool= null;
private static volatile ThreadPoolExecutor pool =null;
public static ThreadPoolExecutor getInstance(){
if(pool ==null){
synchronized (ThreadPoolExecutor.class) {
if(pool == null){
init();
return pool;
}
}
}
return pool;

}
private static void init() {
// TODO Auto-generated method stub
pool=new ThreadPoolExecutor(10, 30, 30, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>(),
new CustomThreadFactory(),new CustomRejectedExecutionHandler());

}

private static void destory(){
if(pool != null){
pool.shutdown();
}
}
private static class CustomThreadFactory implements ThreadFactory{
private AtomicInteger count=new AtomicInteger(0);
@Override
public Thread newThread(Runnable r) {
// TODO Auto-generated method stub
Thread t = new Thread(r);
String threadName = CustomThreadPoolExecutor.class.getSimpleName()+count.addAndGet(1);
System.out.println(threadName);
t.setName(threadName);
return t;
}

}

private static class CustomRejectedExecutionHandler implements RejectedExecutionHandler{

@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// TODO Auto-generated method stub
//拒绝策略
}

}

public static void main(String[] args) {
ThreadPoolExecutor pool=CustomThreadPoolExecutor.getInstance();

for(int i=1;i<100;i++){
System.out.println("提交第"+i+"个任务!");
pool.execute(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("InterruptedException1");
}
System.out.println("running-----"+Thread.currentThread().getId());
}
});

System.out.println("pool size"+pool.getPoolSize());
}
}
}

 

 

拒绝策略:

RejectedExecutionHandler接口提供了拒绝任务处理的自定义方法的机会。在ThreadPoolExecutor中已经包含四种处理策略:

    1. CallerRunsPolicy:线程调用运行该任务的 execute 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。 
      public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { r.run(); }} 
      这个策略显然不想放弃执行任务。但是由于池中已经没有任何资源了,那么就直接使用调用该execute的线程本身来执行。(开始我总不想丢弃任务的执行,但是对某些应用场景来讲,很有可能造成当前线程也被阻塞。如果所有线程都是不能执行的,很可能导致程序没法继续跑了。需要视业务情景而定吧。)
    2. AbortPolicy:处理程序遭到拒绝将抛出运行时 RejectedExecutionException 
      public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {throw new RejectedExecutionException();} 
      这种策略直接抛出异常,丢弃任务。(jdk默认策略,队列满并线程满时直接拒绝添加新任务,并抛出异常,所以说有时候放弃也是一种勇气,为了保证后续任务的正常进行,丢弃一些也是可以接收的,记得做好记录)
    3. DiscardPolicy:不能执行的任务将被删除 
      public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {} 
      这种策略和AbortPolicy几乎一样,也是丢弃任务,只不过他不抛出异常。
    4. DiscardOldestPolicy:如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程) 
      public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) {e.getQueue().poll();e.execute(r); }} 
      该策略就稍微复杂一些,在pool没有关闭的前提下首先丢掉缓存在队列中的最早的任务,然后重新尝试运行该任务。这个策略需要适当小心。

线程池

标签:rgs   rate   资源   抛出异常   拒绝策略   简单的   time   name   .sh   

原文地址:https://www.cnblogs.com/jing-ma/p/9662507.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!