Java:谈谈线程池的使用?

简介

线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。

核心参数

  1、核心线程数

  2、最大线程数

  3、空闲线程最大存活时间

  4、时间单位

  5、线程等待队列

  5、线程工厂

  6、饱和策略

 

饱和策略

1、ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 【默认】

2、ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。

3、ThreadPoolExecutor.DiscardOldestPolicy:丢弃线程队列的中最先进来的任务,将新的任务添加到队列中。

4、ThreadPoolExecutor.CallerRunsPolicy:由调用线程来处理该任务。

 

创建线程池

    ExecutorService temp = new ThreadPoolExecutor(
            2,
            5,
            3,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(3),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.DiscardOldestPolicy());

 

获取线程,执行任务

temp.submit(Runnable task);

 

线程池执行流程:

 

JDK内置线程池

通过Executors对象可以获取:

  1、FixedThreadPool:线程数固定的线程池;

  2、CachedThreadPool:线程数根据任务动态调整的线程池;

  3、SingleThreadExecutor:仅单线程执行的线程池;

  ....

 

提问:为何不推荐使用jdk内置线程池?

回答:因为内置线程池底层设计中,对线程数量等待队列长度的设置为 Integer.MAX_VALUE ,存在OOM(内存泄漏)风险。

 

posted @ 2023-04-20 23:34  在博客做笔记的路人甲  阅读(41)  评论(0编辑  收藏  举报