美文网首页
java.util.concurrent 线程池执行者 Thr

java.util.concurrent 线程池执行者 Thr

作者: dinel | 来源:发表于2020-04-28 23:29 被阅读0次

线程池执行者 ThreadPoolExecutor

java.util.concurrent.ThreadPoolExecutor 是 ExecutorService 接 口 的 一 个 实 现 。
ThreadPoolExecutor 使用其内部池中的线程执行给定任务(Callable 或者 Runnable)。
ThreadPoolExecutor 包含的线程池能够包含不同数量的线程。池中线程的数量由以下变量决定:

  1. corePoolSize
  2. maximumPoolSize
    当一个任务委托给线程池时,如果池中线程数量低于 corePoolSize,一个新的线程将被创建,即使池中可能尚有空闲线程。
    如果内部任务队列已满,而且有至少 corePoolSize 正在运行,但是运行线程的数量低于maximumPoolSize,一个新的线程将被创建去执行该任务。
    ThreadPoolExecutor 图解:
图片.png

创建一个 ThreadPoolExecutor

ThreadPoolExecutor 有若干个可用构造子。比如:
int corePoolSize = 5;
int maxPoolSize = 10;
long keepAliveTime = 5000;
ExecutorService threadPoolExecutor =new ThreadPoolExecutor(
corePoolSize,
maxPoolSize,
keepAliveTime,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()
);
但是,除非你确实需要显式为 ThreadPoolExecutor 定 义 所 有 参 数 , 使 用
java.util.concurrent.Executors 类中的工厂方法之一会更加方便,正如 ExecutorService 小节
所述。

定时执行者服务ScheduledExecutorService

java.util.concurrent.ScheduledExecutorService 是一个 ExecutorService,它能够将任务延后执行,或者间隔固定时间多次执行。 任务由一个工作者线程异步执行,而不是由提交任务给ScheduledExecutorService 的那个线程执行。

ScheduledExecutorService 例子

以下是一个简单的 ScheduledExecutorService 示例:

ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(5);
ScheduledFuture scheduledFuture =
scheduledExecutorService.schedule(new Callable() {
    public Object call() throws Exception {
        System.out.println("Executed!");
         return "Called!";
    }
},5,TimeUnit.SECONDS);

首先一个内置 5 个线程的 ScheduledExecutorService 被创建。之后一个 Callable 接口的匿名类示例被创建然后传递给 schedule() 方法。后边的俩参数定义了 Callable 将在 5 秒钟之后被执行。

ScheduledExecutorService 实现

既然 ScheduledExecutorService 是一个接口,你要用它的话就得使用 java.util.concurrent 包
里对它的某个实现类。ScheduledExecutorService 具有以下实现类:

  1. ScheduledThreadPoolExecutor

创建一个 ScheduledExecutorService

如何创建一个 ScheduledExecutorService 取决于你采用的它的实现类。但是你也可以使用Executors 工厂类来创建一个 ScheduledExecutorService 实例。比如:

ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(5);

ScheduledExecutorService 使用

一旦你创建了一个 ScheduledExecutorService,你可以通过调用它的以下方法:

  1. schedule (Callable task, long delay, TimeUnit timeunit)
  2. schedule (Runnable task, long delay, TimeUnit timeunit)
  3. scheduleAtFixedRate (Runnable, long initialDelay, long period, TimeUnit timeunit)
  4. scheduleWithFixedDelay (Runnable, long initialDelay, long period, TimeUnit timeunit)
    下面我们就简单看一下这些方法。

schedule (Callable task, long delay, TimeUnit timeunit)

这个方法计划指定的 Callable 在给定的延迟之后执行。
这个方法返回一个 ScheduledFuture,通过它你可以在它被执行之前对它进行取消,或者在它执行之后获取结果。
以下是一个示例:

ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(5);
ScheduledFuture scheduledFuture =
scheduledExecutorService.schedule(new Callable() {
    public Object call() throws Exception {
        System.out.println("Executed!");
        return "Called!";
    }
  },5,TimeUnit.SECONDS);
System.out.println("result = " + scheduledFuture.get());
scheduledExecutorService.shutdown();

示例输出结果:
Executed!
result = Called!

schedule (Runnable task, long delay, TimeUnit timeunit)

除了 Runnable 无法返回一个结果之外,这一方法工作起来就像以一个 Callable 作为一个参数的那个版本的方法一样,因此 ScheduledFuture.get() 在任务执行结束之后返回 null。

scheduleAtFixedRate (Runnable, long initialDelay, long period, TimeUnit timeunit)

这一方法规划一个任务将被定期执行。该任务将会在首个 initialDelay 之后得到执行,然后每个 period 时间之后重复执行。
如果给定任务的执行抛出了异常,该任务将不再执行。如果没有任何异常的话,这个任务将会持续循环执行到 ScheduledExecutorService 被关闭。
如果一个任务占用了比计划的时间间隔更长的时候,下一次执行将在当前执行结束执行才开始。计划任务在同一时间不会有多个线程同时执行。

scheduleWithFixedDelay (Runnable, long initialDelay, long period, TimeUnit timeunit)

除了 period 有不同的解释之外这个方法和 scheduleAtFixedRate() 非常像。
scheduleAtFixedRate() 方法中,period 被解释为前一个执行的开始和下一个执行的开始之间的间隔时间。
而在本方法中,period 则被解释为前一个执行的结束和下一个执行的结束之间的间隔。因此这个延迟是执行结束之间的间隔,而不是执行开始之间的间隔。

ScheduledExecutorService 关闭

正如 ExecutorService,在你使用结束之后你需要把 ScheduledExecutorService 关闭掉。否则他将导致 JVM 继续运行,即使所有其他线程已经全被关闭。
你可以使用从 ExecutorService 接口继承来的 shutdown() 或 shutdownNow() 方法将ScheduledExecutorService 关闭。参见 ExecutorService 关闭部分以获取更多信息。

相关文章

  • java.util.concurrent 线程池执行者 Thr

    线程池执行者 ThreadPoolExecutor java.util.concurrent.ThreadPool...

  • ThreadPoolExecutor的用法

    Java中的线程池 一般我们说起Java中的线程池,其实指的是java.util.concurrent包下的Thr...

  • Executors

    Executors生成常用的几种线程池执行者 可缓存线程池 定长的线程池 定时线程池 ScheduledThrea...

  • 【JAVA提升】- 线程、线程池、并发包(3)

    1.线程池(java.util.concurrent) 为什么要有线程池 ? 我们知道。使用线程来处理任务,可以达...

  • Java线程池简介

    ThreadPoolExecutor解析 Java里线程池的基本接口是 Executor: 实现线程池的类是Thr...

  • SpringBoot2.X整合线程池(ThreadPoolTas

    我们在JDK中,可以使用ThreadPoolExecutor提供线程池服务,相关理论,可以在多线程——线程池Thr...

  • 线程池-1

    要点: 1.线程池原理,wait/notify ? 实现一个简易的线程池,http://ifeve.com/thr...

  • 05-线程池ThreadPoolExecutor

    在java.util.concurrent包中Executors类中,线程池的工厂类,用来生产线程池 使用步骤 使...

  • 线程池笔记

    前言:线程池相关的所有类都在java.util.concurrent包下面 一、线程池的继承关系: 二、重点介绍T...

  • 10.3多线程详解

    Java高级-多线程 多线程创建 多线程通讯 线程池 1.多线程创建 thread/runnable图:继承Thr...

网友评论

      本文标题:java.util.concurrent 线程池执行者 Thr

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