模仿一般数据库连接池的配置,看了BoneCP的源代码实现,里面关于BoneCPConfig类的实现,采用了ThreadPoolExecutor的实现方式,然后就想到采用spring的注入方式,ThreadPoolExecutor在异步处理方面做得相当好。
那么接下来看下实现方式!
stpe1: spirng.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/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- Beans Declaration --> <bean id="TestTask" class="org.ibyoung.task.TestTask"></bean> <bean id="ThreadPoolMonitorService" class="org.ibyoung.monitor.srv.ThreadPoolMonitorService"> <property name="monitoringPeriod" value="5" /> </bean> <bean id="TestRejectedExecutionHandler" class="org.ibyoung.handler.TestRejectedExecutionHandler"></bean> <bean id="TestThreadPoolExecutorService" class="org.ibyoung.srv.TestThreadPoolExecutorService"> <property name="corePoolSize" value="1" /> <property name="maxPoolSize" value="3" /> <property name="keepAliveTime" value="1" /> <property name="queueCapacity" value="3" /> <property name="testRejectedExecutionHandler" ref="TestRejectedExecutionHandler" /> </bean> <bean id="Starter" class="org.ibyoung.start.Starter"> <property name="threadPoolMonitorService" ref="ThreadPoolMonitorService" /> <property name="testThreadPoolExecutorService" ref="TestThreadPoolExecutorService" /> </bean> </beans>
step2: 声明配置文件
import java.util.concurrent.ThreadPoolExecutor; import com.otv.handler.TestRejectedExecutionHandler; /** * * @author chenyang * */ 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); }
step3: 实现
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import com.otv.handler.TestRejectedExecutionHandler; /** * * @author chenyang * */ 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<Runnable>(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; } }
step4: 监听类
import java.util.concurrent.ThreadPoolExecutor; public interface IThreadPoolMonitorService extends Runnable { public void monitorThreadPool(); public ThreadPoolExecutor getExecutor(); public void setExecutor(ThreadPoolExecutor executor); }
step5: 服务启动类
import java.util.concurrent.ThreadPoolExecutor; /** * * @author chenyang * */ public class Starter { private static Logger log = Logger.getLogger(TestRejectedExecutionHandler.class); IThreadPoolMonitorService threadPoolMonitorService; ITestThreadPoolExecutorService testThreadPoolExecutorService; public void start() { ThreadPoolExecutor executor = testThreadPoolExecutorService.createNewThreadPool(); executor.allowCoreThreadTimeOut(true); threadPoolMonitorService.setExecutor(executor); Thread monitor = new Thread(threadPoolMonitorService); monitor.start(); for(int i=1;i<10;i++) { executor.execute(new TestTask("Task"+i)); } try { Thread.sleep(40000); } catch (Exception e) { log.error(e.getMessage()); } System.out.println("-------------------------------------------"); for(int i=10;i<19;i++) { executor.execute(new TestTask("Task"+i)); } 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; } }
相关推荐
这个类是Spring对Java内置的`java.util.concurrent.ThreadPoolExecutor`的封装,允许开发者在Spring应用上下文中声明式地定义线程池。在本篇文章中,我们将深入探讨`ThreadPoolTaskExecutor`的配置及其使用,并结合`...
Spring线程池ThreadPoolExecutor配置并且得到任务执行的结果 在Java中,线程池是一种非常重要的技术,能够帮助我们更好地管理线程资源,提高系统的性能和可扩展性。其中,ThreadPoolExecutor是Java中的一种线程池...
3. `ThreadPoolTaskExecutor`:这是Spring最常用的线程池实现,它包装了`java.util.concurrent.ThreadPoolExecutor`,支持线程池配置,并且是异步执行任务的。 4. `ConcurrentTaskExecutor`:作为`Executor`接口的...
2. **ExecutorService和ThreadPoolExecutor**:Java并发框架中的重要工具,可以管理和控制线程池,提高系统资源利用率。 3. **Future和Callable**:Callable接口用于创建带返回值的线程,Future接口用于获取线程...
在Spring中,我们可以使用`ThreadPoolTaskExecutor`,这是Spring对`ThreadPoolExecutor`的封装,提供了更便捷的配置方式。 为了在Spring中使用`ThreadPoolTaskExecutor`,我们需要在配置类中声明一个bean,如下所示...
在Java编程中,Spring框架提供了一种优雅的方式来管理和执行异步任务,这就是Spring的线程池。线程池是多线程编程中的一个重要概念,它能够有效地管理并发任务的执行,提高系统的性能和效率。本实例将深入探讨Spring...
于是乎到现在的Hibernate、MyBatis、Spring、Spring MVC、AQS、ThreadPoolExecutor、CountDownLatch使用场景和核心源码分析。 感觉自己还是真的菜鸡,有太多框架的底层实现都不怎么了解。 当山头被一座一座攻克时,...
在实际应用中,我们可能还需要关注线程池的监控和调优,例如通过JMX或Spring的`ThreadPoolTaskExecutor`进行监控,以及根据系统负载动态调整线程池参数。 至于提到的"工具"标签,可能指的是使用一些工具库如Apache ...
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/> ``` 1. **核心线程数** (`corePoolSize`): 表示线程池中保持的最小线程数量,即使这些线程处于空闲状态也会被保留下来。在这个例子...
在Spring Boot应用中,使用线程池和异步处理是提高系统并发性能和响应速度的重要手段。`@Async`注解是Spring提供的一个特性,用于标记方法为异步执行,这样可以避免主线程等待耗时的操作,提高系统效率。本文将详细...
此外,Java并发库中的ThreadPoolExecutor允许自定义线程池参数,以适应不同的并发场景,防止资源过度消耗。 总的来说,理解并熟练运用Spring微服务框架、JVM调优技巧、数据监控工具以及并发控制策略,是成为一名...
6. **线程池**:Java的ExecutorService接口和ThreadPoolExecutor类提供了线程池的管理,通过线程池可以有效地控制并发数量,提高系统效率并减少资源消耗。 7. **并发工具类**:Java并发包(java.util.concurrent)...
首先,Spring提供了`ThreadPoolTaskExecutor`,这是一个基于Java的`ThreadPoolExecutor`实现的任务执行器。开发者可以通过配置bean来定制线程池参数,如核心线程数、最大线程数、队列大小等,以适应不同场景下的并发...
`ThreadPoolTaskScheduler`是其常见实现,它基于`ThreadPoolExecutor`。 3. **CronTrigger**: 在Spring中,我们经常用到`@Scheduled`注解配合cron表达式来实现按时间触发的任务。cron表达式是一种强大的定时表达...
为了避免这个问题,Spring 提供了 ThreadPoolTaskExecutor,这个类是对 java.util.concurrent.ThreadPoolExecutor 的包装,提供了自定义配置线程池的功能。 自定义线程池需要了解几个主要的概念,例如核心线程数量...
`ThreadPoolTaskExecutor`是Spring提供的一个线程池实现,它是基于Java的`java.util.concurrent.ThreadPoolExecutor`类。开发者可以通过配置线程池的核心线程数、最大线程数、线程存活时间、工作队列容量等参数,以...
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /> ``` 在上面的配置中,我们定义了一个名为taskExecutor的Bean,class为ThreadPoolTaskExecutor。然后,我们通过property元素设置了...
4. **ThreadPoolTaskExecutor**:基于Java 5的ThreadPoolExecutor,是Java 5环境下最常用的实现,允许配置线程池参数。 5. **SimpleThreadPoolTaskExecutor**:基于Quartz的SimpleThreadPool,适合Quartz和其他非...
在 Spring Boot 中使用 Java 线程池 ExecutorService 的讲解 Spring Boot 作为一个流行的 Java 框架,提供了许多便捷的功能来帮助开发者快速构建应用程序。其中之一就是使用 Java 线程池 ExecutorService 来管理...
Spring Boot 2.0 实现优雅停机的方法 Spring Boot 2.0 中实现优雅停机的方法主要是通过配置 Tomcat 容器和实现 GracefulShutdown 类来实现的。优雅停机是指在关闭应用程序时,先停止接收新的请求,然后等待所有...