Thread线程池的使用

88 阅读1分钟

[java基础]Thread线程池的使用

1. Spring使用线程池

1.1 Policy

常见四种策略如下

  • AbortPolicy: 丢弃任务并抛出RejectedExecutionException异常。(默认拒绝策略)
  • DiscardPolicy:丢弃任务,但是不抛出异常。
  • DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务。
  • CallerRunsPolicy:由调用方线程处理该任务。

如果线程池拒绝策略设置不合理,就容易有坑。我们把拒绝策略设置为DiscardPolicy或DiscardOldestPolicy并且在被拒绝的任务,Future对象调用get()方法,那么调用线程会一直被阻塞。

1.2 Spring Integration

  • corePoolSize:队列没满时,线程最大并发数
  • maxiumumPoolSizes:队列满后线程能够达到的最大并发数
  • keepAliveTime:空闲线程过多久被回收的时间限制
  • unit:keepAliveTime的时间单位
  • workQueue:阻塞的队列类型
  • RejectedExecutionHandler:超出maximumPoolSizes+workQueue时,任务交给RejectedExecutionHandler来处理
@Bean(name = "threadPoolTaskExecutor")  
public Executor threadPoolTaskExecutor() {  
    ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();  
    executor.setCorePoolSize(5);  
    executor.setMaxPoolSize(10);  
    executor.setThreadNamePrefix("Nolan-%d");  
    // 其他参数设置  
    return new ThreadPoolTaskExecutor();  
}

1.3 Submit or Execute

submit提交任务,不会把异常直接这样抛出来

public class ThreadDemo {  
  
    public static void main(String[] args) throws Exception {  
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(551,  
                TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(20),new CustomizableThreadFactory("Nolan-Thread"));  
        for (int i = 0; i < 5; i++) {  
            threadPoolExecutor.submit(()->{  
                System.out.println("current thread name" + Thread.currentThread().getName());  
                Object object = null;  
                System.out.print("result## " + object.toString());  
            });  
        }  
  
    }  
}

使用execute方法执行,就可以try...catch捕获异常

public class ThreadDemo {  
  
    public static void main(String[] args) throws Exception {  
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(551,  
                TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(20),new CustomizableThreadFactory("Nolan-Thread"));  
        for (int i = 0; i < 5; i++) {  
            threadPoolExecutor.submit(()->{  
                System.out.println("current thread name" + Thread.currentThread().getName());  
                try {  
                    Object object = null;  
                    System.out.print("result## " + object.toString());  
                }catch (Exception e){  
                    System.out.println("异常了"+e);  
                }  
            });  
        }  
  
    }  
}

1.4 Close

public class ThreadDemo {  
  
    public static void main(String[] args) throws Exception {  
  
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(551,  
                TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(20), new CustomizableThreadFactory("Tianluo-Thread-pool"));  
        threadPoolExecutor.execute(() -> {  
            System.out.println("this is colse demo !");  
        });  
  
        //关闭线程池  
        threadPoolExecutor.shutdown();  
    }  
}