JUC-ThreadPool

2020-03-06  本文已影响0人  GIT提交不上

  线程池:控制运行的线程数量,底层是阻塞队列。

  线程池示例代码如下所示:

/**
 * @author luffy
 **/
public class ThreadPoolDemo {
    public static void main(String[] args){
//        System.out.println(Runtime.getRuntime().availableProcessors());
//        ExecutorService service = Executors.newFixedThreadPool(5);
//        ExecutorService service = Executors.newSingleThreadExecutor();
        ExecutorService service = Executors.newCachedThreadPool();
        try {
            for (int i = 0; i < 10; i++) {
                service.execute(()->{
                    System.out.println(Thread.currentThread().getName()+":处理业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            service.shutdown();
        }
    }
}

  常用线程池如下:

   ThreadPoolExecutor类结构图如下所示:

图1-1 ThreadPoolExecutor类结构图.png

  线程池ThreadPoolExecutor构造方法7大参数:

   public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

  拒绝处理策略如下:

  线程池任务执行过程如下所示:

图1-2 线程池任务执行过程.png

  线程池状态转化图如下所示:

图1-3 线程池状态转换图.png 图1-4 keepAliveTime源码使用图.png

  手写线程池示例代码如下所示:

/**
 * @author luffy
 **/
public class ThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService service = new ThreadPoolExecutor(
                5,
                10,
                2L,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(5),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardPolicy());
        // new ThreadPoolExecutor.AbortPolicy()
        // new ThreadPoolExecutor.CallerRunsPolicy()
        // new ThreadPoolExecutor.DiscardOldestPolicy()
        // new ThreadPoolExecutor.DiscardPolicy()
        try {
            for (int i = 0; i < 30; i++) {
                service.execute(()->{
                    System.out.println(Thread.currentThread().getName()+":银行柜台处理业务!");
                });
            }

        }finally {
            service.shutdown();
        }
    }
}

  线程池参数配置:

//获取PCU核数
Runtime.getRuntime().availableProcessors()

  进一步研究CompletionService:

CompletionService解析

上一篇 下一篇

猜你喜欢

热点阅读