JAVA多线程之线程池的使用

public class TestThreadPool {

    public static void main(String[] args) throws ExecutionException {
        //所使用阻塞队列

        //直接提交策策略,工作队列不保存任何任务被等待执行,而是直接提交给线程进行执行。newCachedThreadPool所使用阻塞队列
        //使用此阻塞队列时num不能大于maximumPoolSize,否则将报错(因为直接执行)
        //并且一次性执行num个线程
        BlockingQueue<Runnable> queue = new SynchronousQueue<>();

        //无界队列策略,工作队列大小没有上限,可以添加无数个任务进行等待。newFixedThreadPool使用阻塞队列
        //使用此阻塞队列时num能大于maximumPoolSize(因为无界,实际上就是maximumPoolSize已经无效了)
        //并且一次性执行corePoolSize个线程
        BlockingQueue<Runnable> queue2 = new LinkedBlockingQueue<>();

        //有界队列策略,工作队列大小有上限(防止工作队列被无休止的添加)
        //这个队列会保持队列中有capacity个线程在等待,其余线程执行
        BlockingQueue<Runnable> queue3 = new ArrayBlockingQueue<>(3); //capacity = 3

        //丢弃任务并抛出RejectedExecutionException异常
        //ThreadPoolExecutor.AbortPolicy

        //丢弃任务,但是不抛出异常
        //ThreadPoolExecutor.DiscardPolicy

        //丢弃队列最前面的任务,然后重新提交被拒绝的任务
        //ThreadPoolExecutor.DiscardOldestPolicy

        //由调用线程(提交任务的线程)处理该任务
        //ThreadPoolExecutor.CallerRunsPolicy

        //核心线程数量
        int corePoolSize = 2;
        //最大线程池大小
        int maximumPoolSize = 10;
        //创建线程数量
        int num = 10;
        ExecutorService pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
                60, TimeUnit.SECONDS, queue3);

        for (int i = 0; i < num; i++) {
            pool.execute(()->{
                try {
                    Thread.sleep(2000);
                    System.out.println(Thread.currentThread().getName()+"执行了一次run()");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        pool.shutdown();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章