美文网首页
8.线程池-1

8.线程池-1

作者: nieniemin | 来源:发表于2021-08-03 21:35 被阅读0次

一、线程池概念:

1. 什么是线程池?

jdk1.5之后java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池。线程池是事先创建若干个可执行的线程放入一个池(容器)中。在需要的时候直接从池中获取线程而不用自行创建,使用完毕不需要销毁线程而是放回到池(容器)中。从而减少创建和销毁线程对象的开销。

2.为什么使用线程池?

在前面使用线程的例子中,如果你的idea安装了阿里编码规约插件可能已经注意到idea提示不要显式创建线程,请使用线程池。,这说明线程池比直接创建线程有优势,否则编码规约不会警告我们。线程池具体优势总结如下:

  • 降低系统资源消耗,通过重用已存在的线程,降低线程的创建和销毁造成的消耗;
  • 提高系统响应速度,当有任务到达时,通过复用已存在线程,无需等待新线程创建便可以立即执行;
  • 方便线程并发数的管理,因为线程如果无限制的创建,可能会导致内存占用过多出现OOM,cpu过度切换也会造成性能降低
  • 提供更强大的功能,延时定时线程池

下面我们通过循环1w次,开启1w线程打印i值,来简单对比下线程池和线程的性能。是否如上面提到的有那么多优势:

public class ExecutorsTest {
    static List<Integer> list = new ArrayList<>();
    public static void threads() throws InterruptedException {

        for (int i = 0; i < 10_000; i++) {
            int tmp = i;
            Thread thread = new Thread(() -> {
                list.add(tmp);
            });
            // for循环1000次,开启1000个线程
            thread.start();
            thread.join();
        }
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        try {
            threads();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
      
        Optional.of("1000个线程执行耗时->" + (end - start)).ifPresent(System.out::println);
    }
}
****************************************************
1000个线程执行耗时->2055

通过Executors.newSingleThreadExecutor():创建一个单线程化的线程池。

public class ExecutorsTest {

    static List<Integer> list = new ArrayList<>();
    public static void threads() throws InterruptedException {

        ExecutorService executorService = Executors.newSingleThreadExecutor();

        for (int i = 0; i < 10_000; i++) {
            int tmp = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    list.add(tmp);
                }
            });
        }
        executorService.shutdown();
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        try {
            threads();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        
        Optional.of("线程池执行耗时->" + (end - start)).ifPresent(System.out::println);
    }
}
*****************************
线程池执行耗时->14

通过代码对比,很明显线程池和线程之间的性能差距。newSingleThreadExecutor线程池限制系统中执行线程的数量(只会有一个线程执行)。减少了浪费了系统资源,cpu调度和切换带来的时间损耗。

相关文章

  • 8.线程池-1

    一、线程池概念: 1. 什么是线程池? jdk1.5之后java.util.concurrent.Executor...

  • 线程以及java线程池实现分享

    线程以及java线程池实现分享 线程简介 JDK线程池的工作原理 JDK线程池的实现细节 1.线程简介-由来 1....

  • Android 线程池原理

    线程池核心类 : ThreadPoolExecutor:提供了一系列参数来配置线程池 线程池优点: 1.重用线程池...

  • 线程池

    1.线程池简介 1.1 线程池的概念 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性...

  • 面试题2019年7月

    线程池原理 参考:Java 线程池原理分析 线程池工作原理:1、线程数量小于 corePoolSize,直接创建新...

  • 线程池

    线程池组件 1、线程池管理器(ThreadPoolManager):用于创建并管理线程池 2、工作线程(WorkT...

  • 线程池相关知识

    线程池 1. 什么是线程池 线程的池化,一个线程的容器、集合,包含多个线程 2. 为什么要用线程池 线程对于操作系...

  • 线程池核心参数

    线程池核心参数 1)corePoolSize(线程池基本大小) 2)maximumPoolSize(线程池最大数量...

  • 线程池学习笔记

    1、线程池的定义 2、Executors创建线程池的方式 3、ThreadPoolExecutor对象 4、线程池...

  • 线程池(3)终止线程池原理

    终止线程池 一、终止线程池方法 1、 shutdown() 安全的终止线程池 2、 shutdownNow() 强...

网友评论

      本文标题:8.线程池-1

      本文链接:https://www.haomeiwen.com/subject/ahoevltx.html