• 线程池


    示例:

    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没有关闭的前提下首先丢掉缓存在队列中的最早的任务,然后重新尝试运行该任务。这个策略需要适当小心。
      5. Java多线程-线程池ThreadPoolExecutor的submit返回值Future

        https://blog.csdn.net/qq_25806863/article/details/71214033
  • 相关阅读:
    逆波兰表达式、波兰表达式【数据结构与算法】
    Python下所有所有异常处理办法
    修改jenkins源为国内源
    [sql Server]除非另外还指定了TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效
    原创 CDH 6.2.1 装 es 怎么配置 master ???
    contos7开启端口,关闭防火墙
    分布式下session共享问题和解决
    伪原创api接口[HTTP]
    AI写作机器人基于GPT-3
    基于AI的自动改写文章的软件
  • 原文地址:https://www.cnblogs.com/jing-ma/p/9662507.html
Copyright © 2020-2023  润新知