• ExecutorService 线程池 (转发)


    1.ExecutorService

    java.util.concurrent.ExecutorService

    接口。用来设置线程池并执行多线程任务。它有以下几个方法。

    Future<?> java.util.concurrent.ExecutorService.submit(Runnable task)

    提交任务并执行,返回代表这个任务的future对象。在任务成功执行完毕之前,future.get()会返回null。

    Future java.util.concurrent.ExecutorService.submit(Callable task) 提交一个有返回值的任务并运行。在任务成功执行完毕之前,future.get()会阻塞。

    void java.util.concurrent.ExecutorService.shutdown() 启动一个有序的关闭,关闭那些先前提交过的已执行完毕的任务。此时ExecutorService不再接受新的任务。

    List java.util.concurrent.ExecutorService.shutdownNow() 尝试终止正在执行的任务,终止等待执行的线程,返回等待执行的线程列表。

    boolean java.util.concurrent.ExecutorService.isTerminated()

    进程池已经被shutdown且所有任务均已完成时,返回true。


    2.Executors

    java.util.concurrent.Executors

    工厂类,可以通过静态方法获得实现ExecutorService接口的对象。

    主要有下面几种,见表2-1.

    表2-1 常见的ExecutorService实现类

    ExecutorService 线程池_Java


    2.1ThreadPoolExecutor

    ExecutorService java.util.concurrent.Executors.newCachedThreadPool()

    返回的是java.util.concurrent.ThreadPoolExecutor对象。

    java.util.concurrent.ThreadPoolExecutor

    类。用于接收提交的任务,放到线程池中运行。

    java.util.concurrent.ThreadPoolExecutor.ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

    构造函数。

    corePoolSize:最小线程数。一般会取Runtime.getRuntime().availableProcessors()。 maximumPoolSize:任务变多时,最大线程数。一般会取corePoolSize*20. keepAliveTime:多开的线程用完后,等待一定时间再被回收。 unit:时间单位。 workQueue:当线程池已满,新任务不能立即执行的时候,就会放进此等待队列。 threadFactory:创建线程的工厂。 java.util.concurrent.ThreadPoolExecutor.ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue)

    ThreadPoolExecutor构造函数的重载。

    long java.util.concurrent.ThreadPoolExecutor.getCompletedTaskCount() 返回执行完毕的任务数,是近似值。 long java.util.concurrent.ThreadPoolExecutor.getTaskCount() 返回加入执行计划的所有任务总数,是近似值。 int java.util.concurrent.ThreadPoolExecutor.getActiveCount() 返回正在执行任务的的活动状态的线程数,是近似值。

    java.util.concurrent.ThreadFactory 接口,它只有下面一个方法: Thread java.util.concurrent.ThreadFactory.newThread(Runnable r) 生成Thread并返回。


    2.2 ScheduledThreadPoolExecutor

    java.util.concurrent.ScheduledThreadPoolExecutor.ScheduledThreadPoolExecutor(int corePoolSize) 构造函数,创建“计划线程池执行器”。此类为ExecutorService的实现类。ScheduledFuture<?> java.util.concurrent.ScheduledExecutorService.scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) 开辟新线程执行任务。延迟initialDelay时间后开始执行command,并且按照period时间周期性重复调用,并且保证在上次运行完后才会执行下一次,周期时间不包括command运行时间。

    ScheduledFuture<?> java.util.concurrent.ScheduledExecutorService.scheduleAtFixedRate(Runnable command, long initialDelay, long delay, TimeUnit unit)

    延迟initialDelay时间后开始执行command,并且按照period时间周期性重复调用。周期时间包括command运行时间,如果周期时间比command运行时间短,则command运行完毕后,立刻重复运行。

    3.线程异常

    任务中抛出未被捕获的异常不会造成线程池的线程消失。线程池对此做了保护机制。查看jdk源码可以找到这部分代码。

    4.任务过多

    java.util.concurrent.RejectedExecutionHandler 接口,它只有下面一个方法: void rejectedExecution(Runnable r, ThreadPoolExecutor executor) 当提交的任务不能被ThreadPoolExecutor执行时(如等待队列已满),调用此函数。 java.util.concurrent.ThreadPoolExecutor.AbortPolicy RejectedExecutionHandler的实现类。它会抛出异常RejectedExecutionException。 java.util.concurrent.ThreadPoolExecutor.DiscardPolicy RejectedExecutionHandler的实现类。它的函数体为空,即什么也不做。

    以上是ExecutorService 线程池的内容,更多 ExecutorService 线程 的内容,请您使用右上方搜索功能获取相关信息。

    原文:https://www.aliyun.com/jiaocheng/800619.html

  • 相关阅读:
    Vue部署到相对目录和解决刷新404的问题
    JavaScript时间格式转换
    在Vue中使用Chart.Js
    进制转换和大数除法
    esp8266必备知识
    php 添加 freetype支持
    Linux系统时间同步问题
    busybox date 时间的加减
    kubesphere-wokespaces
    添加系统环境变量
  • 原文地址:https://www.cnblogs.com/zmengj/p/10144990.html
Copyright © 2020-2023  润新知