java并发编程(9)-- 线程池 创建 参数_Java教程

 

一、线程池基本概念

概念:

线程池主要是控制运⾏线程的数量,将待处理任务放到等待队列,然后创建线程执⾏这些任务。

如果超过了最⼤线程数,则等待。

 

为什么⽤线程池?

10年前单核CPU电脑,假的多线程,像⻢戏团⼩丑玩多个球,CPU需要来回切换。

现在是多核电脑,多个线程各⾃跑在独⽴的CPU上,不⽤切换效率⾼

 

线程池的优点:

  • 线程池做的⼯作只要是控制运⾏的线程数量,
  • 处理过程中将任务放⼊队列,然后在线程创建后启动这些 任务,
  • 如果线程数量超过了最⼤数量,超出数量的线程排队等候,等其他线程执⾏完毕,再从队列中取 出任务来执⾏。

 

线程池的主要特点为:

线程复⽤;控制最⼤并发数;管理线程。

1. 线程复⽤:不⽤⼀直new新线程,重复利⽤已经创建的线程来降低线程的创建和销毁开销,节省系 统资源。

2. 提⾼响应速度:当任务达到时,不⽤创建新的线程,直接利⽤线程池的线程。

3. 管理线程:可以控制最⼤并发数,控制线程的创建等。

 

体系:

Executor → ExecutorService → AbstractExecutorService → ThreadPoolExecutor 。

Thr eadPoolExecutor 是线程池创建的核⼼类。类似 Arrays 、 Collections ⼯具类, Executor 也有⾃⼰的⼯具类 Executors 。

 

 

二、线程池三种常⽤创建⽅式

Java中的线程池是通过Executor框架实现的,该框架中⽤到了Executor,Executors, ExecutorService,ThreadPoolExecutor这⼏个类。

java并发编程(9)-- 线程池 创建 参数_Java开发_02

 

newFixedThreadPool线程池

使⽤LinkedBlockingQueue 实现,定⻓线程池。

特点:执⾏⻓期任务性能好,创建⼀个线程池,⼀池有N个固定的线程,有固定线程数的线程

java并发编程(9)-- 线程池 创建 参数_Java开发_03

 

newSingleThreadExecutor线程池

使⽤ LinkedBlockingQueue 实现,⼀池只有⼀个线程。

特点:⼀个任务⼀个任务的执⾏,⼀池⼀线程

java并发编程(9)-- 线程池 创建 参数_Java开发_04

 

 

newCachedThreadPool线程池

使⽤ SynchronousQueue 实现,变⻓线程池。

特点:

执⾏很多短期异步任务,线程池根据需要创建新线程,但在先前构建的线程可⽤时将重⽤他们。

可扩容,遇强则强

 

java并发编程(9)-- 线程池 创建 参数_Java教程_05

 

三、线程池代码演示

java并发编程(9)-- 线程池 创建 参数_Java教程_06

 

package thread;

import java.util.concurrent.*;

/**
 * 线程池代码演示
 */
public class ThreadPoolDemo {

    public static void main(String[] args) {

        //System.out.println("=======Fixed Thread Pool========");

        // // ⼀个池⼦有5个⼯作线程,类似银⾏有5个受理窗⼝
        //threadPoolTask( Executors.newFixedThreadPool(5) );



        //System.out.println("======Single Thread Pool=========");

        // // ⼀个池⼦有1个⼯作线程,类似银⾏有1个受理窗⼝
        // threadPoolTask( Executors.newSingleThreadExecutor() );


        // System.out.println("=====Cached Thread Pool=======");

        // // 不定量线程,⼀个池⼦有N个⼯作线程,类似银⾏有N个受理窗⼝
        // threadPoolTask( Executors.newCachedThreadPool() );



        System.out.println(" =====Custom Thread Pool=======");

        threadPoolTask(new ThreadPoolExecutor(
                2,
                5,
                1L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.CallerRunsPolicy()
        ));

    }

    private static void threadPoolTask(ExecutorService threadPool) {

        //模拟有10个顾客来办理业务
        try {

            for (int i = 1; i <= 10; i++) {

                threadPool.execute(() -> {

                    System.out.println(Thread.currentThread().getName() + "\t办理业务");

                });
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            threadPool.shutdown();
        }

    }

}

java并发编程(9)-- 线程池 创建 参数_Java教程_07

 

四、线程池创建的七个参数

java并发编程(9)-- 线程池 创建 参数_Java开发_08

 

java并发编程(9)-- 线程池 创建 参数_Java教程_09