线程池对于执行同步和异步过程非常重要。 本文介绍如何使用Spring开发和监视线程池服务。 创建线程池已通过两种替代方法进行了说明。

二手技术

JDK 1.6.0_21
Spring3.0.5
Maven的3.0.2

步骤1:建立已完成的专案

创建一个Maven项目,如下所示。 (可以使用Maven或IDE插件来创建它)。

步骤2:图书馆

Spring依赖项已添加到Maven的pom.xml中。

<!-- Spring 3 dependencies -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version>
</dependency>

为了创建runnable-jar,可以使用以下插件。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>1.3.1</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.otv.exe.Application</mainClass></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.schemas</resource></transformer></transformers></configuration></execution></executions>
</plugin>

第3步:创建任务班

通过实现Runnable接口可以创建一个新的TestTask类。 此类显示要执行的任务。

package com.otv.task;import org.apache.log4j.Logger;/*** @author onlinetechvision.com* @since 17 Oct 2011* @version 1.0.0**/
public class TestTask implements Runnable {private static Logger log = Logger.getLogger(TestTask.class);String taskName;public TestTask() {}public TestTask(String taskName) {this.taskName = taskName;}public void run() {try {log.debug(this.taskName + " : is started.");Thread.sleep(10000);log.debug(this.taskName + " : is completed.");} catch (InterruptedException e) {log.error(this.taskName + " : is not completed!");e.printStackTrace();}}@Overridepublic String toString() {return (getTaskName());}public String getTaskName() {return taskName;}public void setTaskName(String taskName) {this.taskName = taskName;}
}

步骤4:建立TestRejectedExecutionHandler类别

通过实现RejectedExecutionHandler接口来创建TestRejectedExecutionHandler类。 如果没有空闲线程并且队列溢出,任务将被拒绝。 此类处理被拒绝的任务。

package com.otv.handler;import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;import org.apache.log4j.Logger;/*** @author onlinetechvision.com* @since 17 Oct 2011* @version 1.0.0**/
public class TestRejectedExecutionHandler implements RejectedExecutionHandler {private static Logger log = Logger.getLogger(TestRejectedExecutionHandler.class);public void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor) {log.debug(runnable.toString() + " : has been rejected");}
}

步骤5:建立ITestThreadPoolExecutorService接口

ITestThreadPoolExecutorService接口已创建。

package com.otv.srv;import java.util.concurrent.ThreadPoolExecutor;import com.otv.handler.TestRejectedExecutionHandler;/*** @author onlinetechvision.com* @since 17 Oct 2011* @version 1.0.0**/
public interface ITestThreadPoolExecutorService {public ThreadPoolExecutor createNewThreadPool();public int getCorePoolSize();public void setCorePoolSize(int corePoolSize);public int getMaxPoolSize();public void setMaxPoolSize(int maximumPoolSize);public long getKeepAliveTime();public void setKeepAliveTime(long keepAliveTime);public int getQueueCapacity();public void setQueueCapacity(int queueCapacity);public TestRejectedExecutionHandler getTestRejectedExecutionHandler();public void setTestRejectedExecutionHandler(TestRejectedExecutionHandler testRejectedExecutionHandler);}

步骤6:建立TestThreadPoolExecutorService类别

通过实现ITestThreadPoolExecutorService接口来创建TestThreadPoolExecutorService类。 此类创建一个新的线程池。

package com.otv.srv;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;import com.otv.handler.TestRejectedExecutionHandler;/*** @author onlinetechvision.com* @since 17 Oct 2011* @version 1.0.0**/
public class TestThreadPoolExecutorService implements ITestThreadPoolExecutorService {private int  corePoolSize;private int  maxPoolSize;private long keepAliveTime;private int  queueCapacity;TestRejectedExecutionHandler testRejectedExecutionHandler;public ThreadPoolExecutor createNewThreadPool() {ThreadPoolExecutor executor = new ThreadPoolExecutor(getCorePoolSize(),getMaxPoolSize(),getKeepAliveTime(),TimeUnit.SECONDS,new ArrayBlockingQueue(getQueueCapacity()),getTestRejectedExecutionHandler());return executor;}public int getCorePoolSize() {return corePoolSize;}public void setCorePoolSize(int corePoolSize) {this.corePoolSize = corePoolSize;}public int getMaxPoolSize() {return maxPoolSize;}public void setMaxPoolSize(int maxPoolSize) {this.maxPoolSize = maxPoolSize;}public long getKeepAliveTime() {return keepAliveTime;}public void setKeepAliveTime(long keepAliveTime) {this.keepAliveTime = keepAliveTime;}public int getQueueCapacity() {return queueCapacity;}public void setQueueCapacity(int queueCapacity) {this.queueCapacity = queueCapacity;}public TestRejectedExecutionHandler getTestRejectedExecutionHandler() {return testRejectedExecutionHandler;}public void setTestRejectedExecutionHandler(TestRejectedExecutionHandler testRejectedExecutionHandler) {this.testRejectedExecutionHandler = testRejectedExecutionHandler;}
}

步骤7:创建IThreadPoolMonitorService接口

IThreadPoolMonitorService接口已创建。

package com.otv.monitor.srv;import java.util.concurrent.ThreadPoolExecutor;public interface IThreadPoolMonitorService extends Runnable {public void monitorThreadPool();public ThreadPoolExecutor getExecutor();public void setExecutor(ThreadPoolExecutor executor);}

步骤8:创建ThreadPoolMonitorService类

ThreadPoolMonitorService类是通过实现IThreadPoolMonitorService接口创建的。 此类监视创建的线程池。

package com.otv.monitor.srv;import java.util.concurrent.ThreadPoolExecutor;
import org.apache.log4j.Logger;/*** @author onlinetechvision.com* @since 17 Oct 2011* @version 1.0.0**/
public class ThreadPoolMonitorService implements IThreadPoolMonitorService {private static Logger log = Logger.getLogger(ThreadPoolMonitorService.class);ThreadPoolExecutor executor;private long monitoringPeriod; public void run() {try {while (true){monitorThreadPool();Thread.sleep(monitoringPeriod*1000);}} catch (Exception e) {log.error(e.getMessage());}}public void monitorThreadPool() {StringBuffer strBuff = new StringBuffer();strBuff.append("CurrentPoolSize : ").append(executor.getPoolSize());strBuff.append(" - CorePoolSize : ").append(executor.getCorePoolSize());strBuff.append(" - MaximumPoolSize : ").append(executor.getMaximumPoolSize());strBuff.append(" - ActiveTaskCount : ").append(executor.getActiveCount());strBuff.append(" - CompletedTaskCount : ").append(executor.getCompletedTaskCount());strBuff.append(" - TotalTaskCount : ").append(executor.getTaskCount());strBuff.append(" - isTerminated : ").append(executor.isTerminated());log.debug(strBuff.toString());}public ThreadPoolExecutor getExecutor() {return executor;}public void setExecutor(ThreadPoolExecutor executor) {this.executor = executor;}   public long getMonitoringPeriod() {return monitoringPeriod;}public void setMonitoringPeriod(long monitoringPeriod) {this.monitoringPeriod = monitoringPeriod;}
}

第9步:创建入门类

启动器类已创建。

package com.otv.start;import java.util.concurrent.ThreadPoolExecutor;import org.apache.log4j.Logger;import com.otv.handler.TestRejectedExecutionHandler;
import com.otv.monitor.srv.IThreadPoolMonitorService;
import com.otv.monitor.srv.ThreadPoolMonitorService;
import com.otv.srv.ITestThreadPoolExecutorService;
import com.otv.srv.TestThreadPoolExecutorService;
import com.otv.task.TestTask;/*** @author onlinetechvision.com* @since 17 Oct 2011* @version 1.0.0**/
public class Starter {private static Logger log = Logger.getLogger(TestRejectedExecutionHandler.class);IThreadPoolMonitorService threadPoolMonitorService;ITestThreadPoolExecutorService testThreadPoolExecutorService;public void start() {// A new thread pool is created...ThreadPoolExecutor executor = testThreadPoolExecutorService.createNewThreadPool();executor.allowCoreThreadTimeOut(true);// Created executor is set to ThreadPoolMonitorService...threadPoolMonitorService.setExecutor(executor);// ThreadPoolMonitorService is started...Thread monitor = new Thread(threadPoolMonitorService);monitor.start();// New tasks are executed...for(int i=1;i<10;i++) {executor.execute(new TestTask("Task"+i));}try {Thread.sleep(40000);} catch (Exception e)   {log.error(e.getMessage());}for(int i=10;i<19;i++) {executor.execute(new TestTask("Task"+i));}// executor is shutdown...executor.shutdown();}   public IThreadPoolMonitorService getThreadPoolMonitorService() {return threadPoolMonitorService;}public void setThreadPoolMonitorService(IThreadPoolMonitorService threadPoolMonitorService) {this.threadPoolMonitorService = threadPoolMonitorService;}public ITestThreadPoolExecutorService getTestThreadPoolExecutorService() {return testThreadPoolExecutorService;}public void setTestThreadPoolExecutorService(ITestThreadPoolExecutorService testThreadPoolExecutorService) {this.testThreadPoolExecutorService = testThreadPoolExecutorService;}
}

步骤10:创建应用程序类

应用程序类已创建。 此类运行应用程序。

package com.otv.start;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author onlinetechvision.com* @since 17 Oct 2011* @version 1.0.0**/
public class Application {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Starter starter = (Starter) context.getBean("Starter");starter.start();}}

步骤11:创建applicationContext.xml

applicationContext.xml已创建。

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- Beans Declaration --><bean id="TestTask" class="com.otv.task.TestTask"></bean><bean id="ThreadPoolMonitorService" class="com.otv.monitor.srv.ThreadPoolMonitorService"><property name="monitoringPeriod"  value="5" /></bean><bean id="TestRejectedExecutionHandler" class="com.otv.handler.TestRejectedExecutionHandler"></bean><bean id="TestThreadPoolExecutorService" class="com.otv.srv.TestThreadPoolExecutorService"><property name="corePoolSize"  value="1" /><property name="maxPoolSize"   value="3" /><property name="keepAliveTime" value="10" /><property name="queueCapacity" value="3" /><property name="testRejectedExecutionHandler" ref="TestRejectedExecutionHandler" /></bean><bean id="Starter" class="com.otv.start.Starter"><property name="threadPoolMonitorService" ref="ThreadPoolMonitorService" /><property name="testThreadPoolExecutorService" ref="TestThreadPoolExecutorService" /></bean>
</beans>

步骤12:创建线程池的替代方法

Spring提供的ThreadPoolTask​​Executor类也可以用于创建线程池。

<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><property name="corePoolSize"  value="1" /><property name="maxPoolSize"   value="3" /><property name="queueCapacity" value="3" />
</bean><bean id="testTaskExecutor" class="TestTaskExecutor"><constructor-arg ref="threadPoolTaskExecutor" />
</bean>

步骤13:建立专案

生成OTV_Spring_ThreadPool项目后,将创建OTV_Spring_ThreadPool-0.0.1-SNAPSHOT.jar

步骤14:运行项目

运行创建的OTV_Spring_ThreadPool-0.0.1-SNAPSHOT.jar文件后,将在下面显示输出日志:

18.10.2011 20:08:48 DEBUG (TestRejectedExecutionHandler.java:19) - Task7 : has been rejected
18.10.2011 20:08:48 DEBUG (TestRejectedExecutionHandler.java:19) - Task8 : has been rejected
18.10.2011 20:08:48 DEBUG (TestRejectedExecutionHandler.java:19) - Task9 : has been rejected
18.10.2011 20:08:48 DEBUG (TestTask.java:25) - Task1 : is started.
18.10.2011 20:08:48 DEBUG (TestTask.java:25) - Task6 : is started.
18.10.2011 20:08:48 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 3 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 2 - CompletedTaskCount : 0 - TotalTaskCount : 5 - isTerminated : false
18.10.2011 20:08:48 DEBUG (TestTask.java:25) - Task5 : is started.
18.10.2011 20:08:53 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 3 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 3 - CompletedTaskCount : 0 - TotalTaskCount : 6 - isTerminated : false
18.10.2011 20:08:58 DEBUG (TestTask.java:27) - Task6 : is completed.
18.10.2011 20:08:58 DEBUG (TestTask.java:27) - Task1 : is completed.
18.10.2011 20:08:58 DEBUG (TestTask.java:25) - Task3 : is started.
18.10.2011 20:08:58 DEBUG (TestTask.java:25) - Task2 : is started.
18.10.2011 20:08:58 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 3 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 3 - CompletedTaskCount : 2 - TotalTaskCount : 6 - isTerminated : false
18.10.2011 20:08:58 DEBUG (TestTask.java:27) - Task5 : is completed.
18.10.2011 20:08:58 DEBUG (TestTask.java:25) - Task4 : is started.
18.10.2011 20:09:03 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 3 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 3 - CompletedTaskCount : 3 - TotalTaskCount : 6 - isTerminated : false
18.10.2011 20:09:08 DEBUG (TestTask.java:27) - Task2 : is completed.
18.10.2011 20:09:08 DEBUG (TestTask.java:27) - Task3 : is completed.
18.10.2011 20:09:08 DEBUG (TestTask.java:27) - Task4 : is completed.
18.10.2011 20:09:08 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 3 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 0 - CompletedTaskCount : 6 - TotalTaskCount : 6 - isTerminated : false
18.10.2011 20:09:13 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 3 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 0 - CompletedTaskCount : 6 - TotalTaskCount : 6 - isTerminated : false
18.10.2011 20:09:18 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 0 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 0 - CompletedTaskCount : 6 - TotalTaskCount : 6 - isTerminated : false
18.10.2011 20:09:23 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 0 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 0 - CompletedTaskCount : 6 - TotalTaskCount : 6 - isTerminated : false
18.10.2011 20:09:28 DEBUG (TestTask.java:25) - Task10 : is started.
18.10.2011 20:09:28 DEBUG (TestRejectedExecutionHandler.java:19) - Task16 : has been rejected
18.10.2011 20:09:28 DEBUG (TestRejectedExecutionHandler.java:19) - Task17 : has been rejected
18.10.2011 20:09:28 DEBUG (TestRejectedExecutionHandler.java:19) - Task18 : has been rejected
18.10.2011 20:09:28 DEBUG (TestTask.java:25) - Task14 : is started.
18.10.2011 20:09:28 DEBUG (TestTask.java:25) - Task15 : is started.
18.10.2011 20:09:28 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 3 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 3 - CompletedTaskCount : 6 - TotalTaskCount : 12 - isTerminated : false
18.10.2011 20:09:33 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 3 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 3 - CompletedTaskCount : 6 - TotalTaskCount : 12 - isTerminated : false
18.10.2011 20:09:38 DEBUG (TestTask.java:27) - Task10 : is completed.
18.10.2011 20:09:38 DEBUG (TestTask.java:25) - Task11 : is started.
18.10.2011 20:09:38 DEBUG (TestTask.java:27) - Task14 : is completed.
18.10.2011 20:09:38 DEBUG (TestTask.java:27) - Task15 : is completed.
18.10.2011 20:09:38 DEBUG (TestTask.java:25) - Task12 : is started.
18.10.2011 20:09:38 DEBUG (TestTask.java:25) - Task13 : is started.
18.10.2011 20:09:38 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 3 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 3 - CompletedTaskCount : 9 - TotalTaskCount : 12 - isTerminated : false
18.10.2011 20:09:43 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 3 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 3 - CompletedTaskCount : 9 - TotalTaskCount : 12 - isTerminated : false
18.10.2011 20:09:48 DEBUG (TestTask.java:27) - Task11 : is completed.
18.10.2011 20:09:48 DEBUG (TestTask.java:27) - Task13 : is completed.
18.10.2011 20:09:48 DEBUG (TestTask.java:27) - Task12 : is completed.
18.10.2011 20:09:48 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 0 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 0 - CompletedTaskCount : 12 - TotalTaskCount : 12 - isTerminated : true
18.10.2011 20:09:53 DEBUG (ThreadPoolMonitorService.java:39) - CurrentPoolSize : 0 - CorePoolSize : 1 - MaximumPoolSize : 3 - ActiveTaskCount : 0 - CompletedTaskCount : 12 - TotalTaskCount : 12 - isTerminated : true

步骤15:下载

OTV_Spring_ThreadPool

参考: 如何使用我们JCG合作伙伴提供的 Spring开发和监视线程池服务   在线技术愿景博客上的Eren Avsarogullari。

翻译自: https://www.javacodegeeks.com/2012/02/spring-thread-pool-services.html

Spring线程池服务相关推荐

  1. spring 线程池_Spring线程池服务

    spring 线程池 线程池对于执行同步和异步过程非常重要. 本文介绍如何使用Spring开发和监视线程池服务. 创建线程池已通过两种替代方法进行了说明. 二手技术 : JDK 1.6.0_21 春天 ...

  2. Spring线程池开发实战

    Spring线程池开发实战 作者:chszs,转载需注明. 作者博客主页:http://blog.csdn.net/chszs 本文提供了三个Spring多线程开发的例子,由浅入深,由于例子一目了然, ...

  3. spring线程池的理解和使用

    1.spring线程池 <bean id="taskExecutor" class="org.springframework.scheduling.concurre ...

  4. spring线程池的使用

    为了尽量减少耗时操作对Action执行的影响,使用TaskExecutor线程池来管理耗时任务,作为后台进程执行,从而解决了问题. 场景:     使用了Struts和Spring,但Struts的A ...

  5. spring线程池使用

    为何使用多线程 对于复杂的业务逻辑下,有时候需要使用多线程执行,以优化项目的执行速度 单线程同步执行的场景中,如果前边出现异常,会导致所有任务中断,异步执行没有这样的问题 多线程实现方式:线程池 减少 ...

  6. Spring 线程池使用

    Spring 中默认自带线程池_org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor,一般有可以直接使用,这是时候使用的是默 ...

  7. Linux服务器7 --- 多路IO复用+线程池服务端模型(高并发)分析

    一.服务端特性概述 1.使用EPOLL模型在服务器中加入(网络IO监听,大量的监听能力) EPOLL采用边缘触发模式(后话) 2.线程池模型进行并发处理业务(并发处理能力) 1)提高线程重用性(避免频 ...

  8. Spring线程池异步传递MDC信息

    目录 1. 什么是MDC 2. 引入MDC打印步骤 2.1 pom依赖 2.2 log4j2打印日志配置文件 3 步骤演示 3.1 单线程业务使用示例 postman查询示例 查询代码 查询日志 3. ...

  9. spring线程池 java_Java 中几种常用的线程池

    概述: 在java内置API中操作线程所用到的类为Thread.创建线程一般有两种方式, 继承Thread方式 实现Runnable方式,并以runnable作为target创建Thread 在And ...

最新文章

  1. OpenStack之虚拟机热迁移
  2. php中的static,php中的static
  3. vue项目-封装API接口
  4. 【控制】盖尔圆盘定理
  5. C语言训练题-铺草坪简易版
  6. 【Tools】MarkDown教程(五)-CSDN MarkDown介绍
  7. 【图论】【最短路】【SPFA】香甜的黄油 Sweet Butter (luogu 1828)
  8. 作业6--团队项目之需求
  9. (3)JavaScript 的注释
  10. u-boot源码汇编段简要分析
  11. gawk Notes(2)
  12. python写鼠标宏_最全Pycharm教程(24)——Pycharm编辑器功能之宏定义
  13. dirent struct,在struct dirent可以文件名有非标准字符?
  14. 学编程以来第一次遇到的灵异事件
  15. 有哪些基于苹果HomeKit的全屋智能家居组合
  16. 学习英文-学以致用【场景:程序员英文-开发环境】
  17. 基于Echarts实现可视化数据大屏大数据可视化
  18. 大数据——Flink Window(窗口)机制
  19. Hbase之一月速成:Hbase的shell命令
  20. Hive内置函数与常用函数汇总

热门文章

  1. 滴滴2017在线笔试有感
  2. zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
  3. java 动画_Java安全动画
  4. trackby_使用trackBy启动流程
  5. payara 创建 集群_在Payara Server和GlassFish中配置密码
  6. angular8 rest_带有Angular JS的Java EE 7 – CRUD,REST,验证–第2部分
  7. java:8最小镜像_Java:本地最小语言
  8. 分布式系统开发注意点_分布式系统开发注意事项
  9. stringutils_番石榴分配器vs StringUtils
  10. 使用Spring Boot隔离集成测试和模拟依赖项