线程池

1.1、什么是线程池?

线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程。线程池中线程的数量通常完全取决于可用内存数量和应用程序的需求。然而,增加可用线程数量是可能的。线程池中的每个线程都有被分配一个任务,一旦任务已经完成了,线程回到池子中并等待下一次分配任务。

1.2、线程池作用

基于以下几个原因在多线程应用程序中使用线程是必须的:

1. 线程池改进了一个应用程序的响应时间。由于线程池中的线程已经准备好且等待被分配任务,应用程序可以直接拿来使用而不用新建一个线程。

2. 线程池节省了CLR 为每个短生存周期任务创建一个完整的线程的开销并可以在任务完成后回收资源。

3. 线程池根据当前在系统中运行的进程来优化线程时间片。

4. 线程池允许我们开启多个任务而不用为每个线程设置属性。

5. 线程池允许我们为正在执行的任务的程序参数传递一个包含状态信息的对象引用。

6. 线程池可以用来解决处理一个特定请求最大线程数量限制问题。

1.3 、 线程池四种创建方式

Java通过Executors(jdk1.5并发包)提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

① newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

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

             final int index = i;

             // try {

             // Thread.sleep(index * 1000);

             // } catch (InterruptedException e) {

             // e.printStackTrace();

             // }

             cachedThreadPool.execute(new Runnable() {

                 public void run() {

                     System.out.println(Thread.currentThread().getName() + "---" + index);

                 }

             });

        }

总结: 线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

② newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

// 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待

        final ExecutorService newCachedThreadPool = Executors.newFixedThreadPool(3);

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

           final int index = i;

           newCachedThreadPool.execute(new Runnable() {

               public void run() {

                   try {

                       Thread.sleep(1000);

                   } catch (Exception e) {

                       // TODO: handle exception

                   }

                   System.out.println("i:" + index);

               }

           });

        }

总结:因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()

③  newScheduledThreadPool

创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

// 创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

        ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(5);

        newScheduledThreadPool.schedule(new Runnable() {

           public void run() {

               System.out.println("delay 3 seconds");

           }

        }, 3, TimeUnit.SECONDS);

表示延迟3秒执行。

④  newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:

   ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();

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

         final int index = i;

         newSingleThreadExecutor.execute(new Runnable() {

            @Override

            public void run() {

               System.out.println("index:" + index);

               try {

                  Thread.sleep(200);

               } catch (Exception e) {

                  // TODO: handle exception

               }

            }

         });

      }

线程池概念、线程池作用、线程池的四种创建方式相关推荐

  1. Java线程池的四种创建方式

    Java线程池的四种创建方式 Java使用Thread类来表示线程,所有的线程都是Thread类或者是他的子类.Java有四种方式来创建线程. (1)继承Thread类创建线程 (2)实现Runnab ...

  2. 线程池 java 新建方式_Java线程池的四种创建方式

    Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...

  3. 线程的常见的几种创建方式

    线程的几种创建方式 文章目录 线程的几种创建方式 1. 继承Thread 2. 实现Runnable接口 3. 实现Callable接口 4. lamda表达式函数 5. 线程池 1. 继承Threa ...

  4. eclipse让实现类也添加上接口的注释_多线程:面试常问的两种创建方式,数据共享实现和正确停止线程...

    多线程 进程与线程的区别: 进程:程序的执行过程,持有资源(内存)(共享内存和文件)和线程.比如,电脑上的eclipse.QQ.微信等运行中的软件就是一个进程 线程应用:1.eclipse编辑代码时, ...

  5. java线程的任务的三种创建方式,严格地说,就一种,就是如何重写Runnable接口的run()方法

    仅简单演示Java中线程任务的三种创建方式 第一种:使用了适配器模式,有返回值,能抛出异常,任务代码写在Callable.call()方法中,Runnable的run方法会通过适配器调用到Callab ...

  6. 线程的三种创建方式和他们的优缺点

    文章目录 一.线程的三种创建方式 1.继承Thread 2.实现Runable接口 3.实现Callable接口 二.三种创建方式的优缺点 1.使用Runnable接口比使用继承Thread的优势 2 ...

  7. 线程的三种创建方式以及代码实现

    线程和进程的概念 一个进程可以有多个线程 程序:是指令和数据的有序集合(静态的) 进程:是执行程序的一次执行过程(动态的),是系统资源分配的单位.在操作系统中运行的程序就是进程. 通常在一个进程中可以 ...

  8. android 多线程间通信,android实现线程间通信的四种常见方式

    1,通过Handler机制 主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递conten ...

  9. Java反射机制01_反射的概念以及获取字节码信息 的四种方式

    Java反射机制01-反射的概念以及获取字节码信息 的四种方式 一.反射的概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象, 都能够调用它的任意 ...

最新文章

  1. wordpress短代码转php,WordPress中的shortcode短代码功能使用详解
  2. 告别Heatmap!人体姿态估计表征新方法SimDR
  3. 盲人可以也做软件工程师,反思一下老哥
  4. Java实现敏感词过滤 - IKAnalyzer中文分词工具
  5. Python 中三大框架各自的应用场景
  6. python os.system 512_python os.system os.popen 区别
  7. 处理minist数据集,把网络和数据都放在gpu上面。
  8. ANSI C: union
  9. java时间格式化yyyy
  10. Spring Boot使用自定义的properties
  11. php操作cookie_php设置cookie【三种方案】
  12. Linux系统下配置JDK环境变量
  13. 云计算-平台架构-开源-OpenStack
  14. 计算机组成原理中总线包括,计算机组成原理复习题
  15. 解决win10开启移动热点共享手机连上后无法上网的问题
  16. 任意模数ntt_再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)...
  17. 数据结构——背包问题
  18. hdu6105(博弈)
  19. 如何将PDF压缩突破限制大小
  20. Erlang公历转农历

热门文章

  1. python hackrf_GnuRadio在HackRF打开的情况下无法运行OS X 10.9.4
  2. 用链脉智能名片,一天帮你交换上百张名片
  3. 太治愈了,这样调色照片更具电影感,LR预设3套
  4. 转化率最高的10个购物网站的经验
  5. python课堂笔记手抄图片报_读书报手抄报图片大全
  6. 【Inpho精品教程】Inpho简介、安装教程(附Inpho8安装包下载)
  7. 堡垒机查看linux版本,Linux堡垒机实现原理(示例代码)
  8. Echarts多系多y轴的配置
  9. Vivado 常见Warning问题解决方法说明
  10. 关于计算机二级的论文5000字,计算机二级word真题:科技论文稿排版