Task 用了这么长时间的Java线程池,你不一定真的了解Java线程池 (有时间好好研究一下)

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

class Task implements Runnable {
    private int id;

    public Task(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        System.out.println(String.format("id = %d is running.", id));
        try {
            Thread.sleep(100000000 * 100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


public static void main(String[] args) {

        LinkedBlockingQueue<Runnable> taskPool = new LinkedBlockingQueue<>(5);
        ThreadPoolExecutor threads = new ThreadPoolExecutor(1, 4, 5L, TimeUnit.SECONDS, taskPool);
        int i = 0;
        threads.submit(new Task(++i));
        Task task = new Task(++i);
        threads.submit(task);
        for (int j = 0; j < 100; j++) {
            if(taskPool.size()==5){
                System.out.println();
            }
            threads.submit(new Task(++i));

        }
        System.out.println();
    }

  

 

备注:

 /**
     *
     * @param corePoolSize 核心数,也是线程池的基础线程数。不论线程是否限制,corePoolSize个线程不会被销毁
     * @param maximumPoolSize 最大线程数,只有当workQueue队列满了才会在corePoolSize个线程基础之上进行扩容到maximumPoolSize数;
     *                        扩容到最大数目之后workQueue还是满的话,将会报错RejectedExecutionException。当然你也可以添加拒绝策略
     * @param keepAliveTime 超过corePoolSize数目线程,闲置时间,超时被销毁。
     * @param unit 时间单位
     * @param workQueue Task队列
     */
    public  ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue);

  

 

public static void main(String[] args) {

        RejectedExecutionHandler reject = new RejectedExecutionHandler() {

            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                // 各种策略吧
                System.out.println("将任务存储到数据库或者Redis中缓冲,然后再启动一个轮询的Thread负责在空闲的时候进行再次提交!");
            }
        };


        System.out.println(reject.getClass());
        LinkedBlockingQueue<Runnable> taskPool = new LinkedBlockingQueue<>(5);
        ThreadPoolExecutor threads = new ThreadPoolExecutor(1, 4, 5L, TimeUnit.SECONDS, taskPool, new BasicThreadFactory.Builder().namingPattern("task-thread-pool-%d").build(), reject);
        int i = 0;
        threads.submit(new Task(++i));
        Task task = new Task(++i);
        threads.submit(task);
        for (int j = 0; j < 100; j++) {
            if (taskPool.size() == 5) {
                System.out.println();
            }
            threads.submit(new Task(++i));

        }
        System.out.println();
    }

  

 

 

posted @ 2019-05-30 20:19  bf378  阅读(510)  评论(0编辑  收藏  举报