线程池管理工作线程池,它包含一个队列,使任务等待执行。 线程池管理可运行线程的集合,工作线程从队列中执行可运行线程。 java.util.concurrent.Executors提供java.util.concurrent.Executor接口的实现,以在Java中创建线程池。
让我们编写一个简单的程序来说明它的工作原理。

首先,我们需要有一个Runnable类。

package com.journaldev.threadpool;public class WorkerThread implements Runnable {private String command;public WorkerThread(String s){this.command=s;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+' Start. Command = '+command);processCommand();System.out.println(Thread.currentThread().getName()+' End.');}private void processCommand() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic String toString(){return this.command;}
}

这是我们从Executors框架创建固定线程池的测试程序。

package com.journaldev.threadpool;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class SimpleThreadPool {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(5);for (int i = 0; i < 10; i++) {Runnable worker = new WorkerThread('' + i);executor.execute(worker);}executor.shutdown();while (!executor.isTerminated()) {}System.out.println('Finished all threads');}}

在上面的程序中,我们正在创建5个工作线程的固定大小的线程池。 然后,我们将10个作业提交到该池中,因为该池的大小为5,它将开始处理5个作业,其他作业将处于等待状态,一旦其中一个作业完成,来自等待队列的另一个作业将被工作线程拾取并执行。

这是上面程序的输出。

pool-1-thread-2 Start. Command = 1
pool-1-thread-4 Start. Command = 3
pool-1-thread-1 Start. Command = 0
pool-1-thread-3 Start. Command = 2
pool-1-thread-5 Start. Command = 4
pool-1-thread-4 End.
pool-1-thread-5 End.
pool-1-thread-1 End.
pool-1-thread-3 End.
pool-1-thread-3 Start. Command = 8
pool-1-thread-2 End.
pool-1-thread-2 Start. Command = 9
pool-1-thread-1 Start. Command = 7
pool-1-thread-5 Start. Command = 6
pool-1-thread-4 Start. Command = 5
pool-1-thread-2 End.
pool-1-thread-4 End.
pool-1-thread-3 End.
pool-1-thread-5 End.
pool-1-thread-1 End.
Finished all threads

输出确认池中有五个线程来自“ pool-1-thread-1? 到“ pool-1-thread-5”? 他们负责执行提交给池的任务。

Executors类提供简单实现的ExecutorService的使用的ThreadPoolExecutor但ThreadPoolExecutor的提供了更多的功能不止于此。 我们可以指定创建ThreadPoolExecutor实例时仍处于活动状态的线程数,并且可以限制线程池的大小,并创建自己的RejectedExecutionHandler实现以处理无法容纳在工作队列中的作业。

这是我们对RejectedExecutionHandler接口的自定义实现。

package com.journaldev.threadpool;import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;public class RejectedExecutionHandlerImpl implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {System.out.println(r.toString() + ' is rejected');}}

ThreadPoolExecutor提供了几种方法,通过这些方法我们可以找到执行器的当前状态,池大小,活动线程数和任务数。 因此,我有一个监视线程,它将在特定时间间隔打印执行程序信息。

package com.journaldev.threadpool;import java.util.concurrent.ThreadPoolExecutor;public class MyMonitorThread implements Runnable
{private ThreadPoolExecutor executor;private int seconds;private boolean run=true;public MyMonitorThread(ThreadPoolExecutor executor, int delay){this.executor = executor;this.seconds=delay;}public void shutdown(){this.run=false;}@Overridepublic void run(){while(run){System.out.println(String.format('[monitor] [%d/%d] Active: %d, Completed: %d, Task: %d, isShutdown: %s, isTerminated: %s',this.executor.getPoolSize(),this.executor.getCorePoolSize(),this.executor.getActiveCount(),this.executor.getCompletedTaskCount(),this.executor.getTaskCount(),this.executor.isShutdown(),this.executor.isTerminated()));try {Thread.sleep(seconds*1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

这是使用ThreadPoolExecutor的线程池实现示例。

package com.journaldev.threadpool;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class WorkerPool {public static void main(String args[]) throws InterruptedException{//RejectedExecutionHandler implementationRejectedExecutionHandlerImpl rejectionHandler = new RejectedExecutionHandlerImpl();//Get the ThreadFactory implementation to useThreadFactory threadFactory = Executors.defaultThreadFactory();//creating the ThreadPoolExecutorThreadPoolExecutor executorPool = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2), threadFactory, rejectionHandler);//start the monitoring threadMyMonitorThread monitor = new MyMonitorThread(executorPool, 3);Thread monitorThread = new Thread(monitor);monitorThread.start();//submit work to the thread poolfor(int i=0; i<10; i++){executorPool.execute(new WorkerThread('cmd'+i));}Thread.sleep(30000);//shut down the poolexecutorPool.shutdown();//shut down the monitor threadThread.sleep(5000);monitor.shutdown();}
}

请注意,在初始化ThreadPoolExecutor时,我们将初始池大小保持为2,最大池大小保持为4,工作队列大小保持为2。因此,如果有4个正在运行的任务并且提交了更多任务,则工作队列将仅容纳其中2个其余的将由RejectedExecutionHandlerImpl处理。

这是上述程序的输出,确认上述声明。

pool-1-thread-1 Start. Command = cmd0
pool-1-thread-4 Start. Command = cmd5
cmd6 is rejected
pool-1-thread-3 Start. Command = cmd4
pool-1-thread-2 Start. Command = cmd1
cmd7 is rejected
cmd8 is rejected
cmd9 is rejected
[monitor] [0/2] Active: 4, Completed: 0, Task: 6, isShutdown: false, isTerminated: false
[monitor] [4/2] Active: 4, Completed: 0, Task: 6, isShutdown: false, isTerminated: false
pool-1-thread-4 End.
pool-1-thread-1 End.
pool-1-thread-2 End.
pool-1-thread-3 End.
pool-1-thread-1 Start. Command = cmd3
pool-1-thread-4 Start. Command = cmd2
[monitor] [4/2] Active: 2, Completed: 4, Task: 6, isShutdown: false, isTerminated: false
[monitor] [4/2] Active: 2, Completed: 4, Task: 6, isShutdown: false, isTerminated: false
pool-1-thread-1 End.
pool-1-thread-4 End.
[monitor] [4/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false
[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false
[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false
[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false
[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false
[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false
[monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown: true, isTerminated: true
[monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown: true, isTerminated: true

注意执行程序的活动,已完成和已完成任务总数的变化。 我们可以调用shutdown()方法来完成所有提交的任务的执行并终止线程池。

参考: Java线程池示例,使用我们的JCG合作伙伴 Pankaj Kumar的Executors和ThreadPoolExecutor ,位于Developer Recipes博客上。

翻译自: https://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor.html

使用执行程序和ThreadPoolExecutor的Java线程池示例相关推荐

  1. java线程池案例_使用Executors 和 ThreadPoolExecutor实现Java线程池案例

    并发主题 使用Executors 和 ThreadPoolExecutor实现Java线程池案例 首先需要一个工作线程: package com.journaldev.threadpool; publ ...

  2. java线程池示例_Java线程连接示例

    java线程池示例 Java Thread join method can be used to pause the current thread execution until unless the ...

  3. ThreadPoolExecutor – Java线程池示例

    Java thread pool manages the pool of worker threads. It contains a queue that keeps tasks waiting to ...

  4. Java线程池示例:任务窃取线程池WorkStealingPool

  5. Java线程池示例:并行计算200000以内的质数个数

    static void countTime() throws Exception {long start = System.currentTimeMillis();List<Integer> ...

  6. 大数据处理系列之(一)Java线程池使用

    前言:最近在做分布式海量数据处理项目,使用到了java的线程池,所以搜集了一些资料对它的使用做了一下总结和探究, 前面介绍的东西大多都是从网上搜集整理而来.文中最核心的东西在于后面两节无界队列线程池和 ...

  7. java threadpoolexecutor 实例_Java线程池(ThreadPoolExecutor)示例

    Java线程池管理工作线程池,它包含一个队列,用于保持任务等待执行.我们可以使用ThreadPoolExecutor在Java中创建线程池. Java线程池管理Runnable线程的集合.工作线程从队 ...

  8. java线程池使用详解ThreadPoolExecutor使用示例

    一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 1) 任务(Runnable /Callable) 2) 任务的执行(Exec ...

  9. Java线程池详解学习:ThreadPoolExecutor

    Java线程池详解学习:ThreadPoolExecutor Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) - zhangpeterx的博客 在源码的目录java/util/ ...

最新文章

  1. C#中导出Excel报表的方法
  2. 参数构造错误 微信_快速掌握前端开发中的常见错误
  3. 【JavaSE_06】Java中的数组(array)-提高练习
  4. vim global命令
  5. 2021百度营销通案
  6. matlab 矩阵引用,MATLAB矩阵生成、引用
  7. 【反向并查集、联通图】P1197 [JSOI2008]星球大战
  8. 【ENVI预处理】辐射校正、影像配准、图像融合、图像镶嵌 、图像裁剪、图像增强
  9. Word 2010—样式集
  10. a byte of python2微盘_《A Byte of Python》与《简明 Python 教程》PDF版
  11. BarTender对单个二维码/文本添加多个域(数据库字段)/嵌入的数据,并对数据添加后缀等处理;扩展更多域
  12. 孟德尔随机化——如何选择工具变量
  13. python3爬虫实战姚良_Python3.X 爬虫实战(缓存与持久化)
  14. 通达OA工作流-流程设计
  15. ubuntu 检测网络状态命令
  16. 免费免安装!3s 获取云数据库,MySQL,Mongo、Redis 全都有!
  17. 计算机网络 自顶向下 笔记
  18. jQuery随笔20190711~0713(选择器、事件、效果)
  19. ERROR 1130 (HY000): Host XXX is not allowed to connect to this MySQL server
  20. 基于单位四元数的姿态插补算法

热门文章

  1. java线程池返回线程状态_Java线程的不同状态
  2. arrays.sort(._Arrays.hashCode(Object [])与Objects.hash(Object…)
  3. junit 静态方法_预期异常规则和模拟静态方法– JUnit
  4. apache camel_您的Apache Camel应用程序现在包括现成的文档
  5. Docker化Spring Boot应用程序
  6. Spring Setter依赖注入示例
  7. scala本地调试_如何编写自己的Java / Scala调试器
  8. Apache Spark Job的剖析
  9. 功能Java示例 第4部分–首选不变性
  10. JSON指针:JSON-P 1.1概述系列