溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用Spring開發(fā)和監(jiān)控線程池服務(wù)

發(fā)布時(shí)間:2021-07-30 16:38:36 來源:億速云 閱讀:171 作者:chen 欄目:編程語言

這篇文章主要介紹“怎么使用Spring開發(fā)和監(jiān)控線程池服務(wù)”,在日常操作中,相信很多人在怎么使用Spring開發(fā)和監(jiān)控線程池服務(wù)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么使用Spring開發(fā)和監(jiān)控線程池服務(wù)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

線程池對執(zhí)行同步或異步的任務(wù)很重要。本文展示如何利用Spring開發(fā)并監(jiān)控線程池服務(wù)。創(chuàng)建線程池的其他兩種方法已講解過。

使用技術(shù)

  • JDK 1.6.0_21

  • Spring 3.0.5

  • Maven 3.0.2

第1步:創(chuàng)建Maven工程

下面是一個(gè)maven工程。(可以使用Maven或IDE的插件創(chuàng)建)。

怎么使用Spring開發(fā)和監(jiān)控線程池服務(wù)

第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>

使用下面的插件創(chuàng)建可執(zhí)行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>                     <transformer                         implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">                         <mainClass>com.otv.exe.Application</mainClass>                     </transformer>                     <transformer                         implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">                         <resource>META-INF/spring.handlers</resource>                     </transformer>                     <transformer                         implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">                         <resource>META-INF/spring.schemas</resource>                     </transformer>                 </transformers>             </configuration>         </execution>     </executions> </plugin>

第3步:創(chuàng)建任務(wù)類

創(chuàng)建一個(gè)實(shí)現(xiàn)Runnable接口的新TestTask類。這個(gè)類表示要執(zhí)行的任務(wù)。

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();         }            }       @Override     public String toString() {         return (getTaskName());     }       public String getTaskName() {         return taskName;     }       public void setTaskName(String taskName) {         this.taskName = taskName;     } }

第4步:創(chuàng)建TestRejectedExecutionHandler類

TestRejectedExecutionHandler類實(shí)現(xiàn)了RejectedExecutionHandler接口。如果沒有空閑線程并且隊(duì)列超出限制,任務(wù)會(huì)被拒絕。這個(gè)類處理被拒絕的任務(wù)。

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步:創(chuàng)建ITestThreadPoolExecutorService接口

創(chuàng)建ITestThreadPoolExecutorService接口。(譯者注:這個(gè)接口的主要功能是通過設(shè)置的參數(shù)創(chuàng)建一個(gè)線程池)

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步:創(chuàng)建TestThreadPoolExecutorService類

TestThreadPoolExecutorService類實(shí)現(xiàn)了ITestThreadPoolExecutorService接口(上一步創(chuàng)建的接口)。這個(gè)類可以創(chuàng)建一個(gè)新的線程池。

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步: 創(chuàng)建IThreadPoolMonitorService接口

創(chuàng)建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步:創(chuàng)建ThreadPoolMonitorService類

ThreadPoolMonitorService類實(shí)現(xiàn)了IThreadPoolMonitorService接口。這個(gè)類用來監(jiān)控已創(chuàng)建的線程池。

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步:創(chuàng)建Starter類

(譯者注:這個(gè)類內(nèi)部維護(hù)了一個(gè)線程池服務(wù)(testThreadPoolExecutorService)和一個(gè)監(jiān)控服務(wù)(threadPoolMonitorService),然后創(chuàng)建線程池、啟動(dòng)一個(gè)單獨(dú)的線程執(zhí)行監(jiān)控服務(wù)、通過線程池執(zhí)行任務(wù))

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&lt;10;i++) {             executor.execute(new TestTask(&quot;Task&quot;+i));         }           try {             Thread.sleep(40000);         } catch (Exception e)   {             log.error(e.getMessage());         }           for(int i=10;i&lt;19;i++) {             executor.execute(new TestTask(&quot;Task&quot;+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步:創(chuàng)建Application類

創(chuàng)建Application類。這個(gè)類運(yùn)行應(yīng)用程序。

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(&quot;applicationContext.xml&quot;);        Starter starter = (Starter) context.getBean(&quot;Starter&quot;);        starter.start();     } }

第11步:創(chuàng)建applicationContext.xml文件

(譯者注:在Spring中注冊了上面所創(chuàng)建的類,并提前設(shè)置了部分相應(yīng)的參數(shù),比如將監(jiān)控服務(wù)的監(jiān)控周期設(shè)為5)

<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="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步:創(chuàng)建線程池的另一方法

Spring提供的ThreadPoolTaskExecutor類也可以創(chuàng)建線程池。

(譯者注:上面通過我們自己創(chuàng)建的TestThreadPoolExecutorService類來設(shè)置線程池的各項(xiàng)參數(shù)并創(chuàng)建線程池,但實(shí)際上Spring也提供了功能類似的類,就是ThreadPoolTaskExecutor。所以也可以使用這種方式創(chuàng)建線程池)

<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步:構(gòu)建項(xiàng)目

OTV_Spring_ThreadPool工程被build后,就會(huì)產(chǎn)生一個(gè)OTV_Spring_ThreadPool-0.0.1-SNAPSHOT.jar包。

第14步:運(yùn)行工程

OTV_Spring_ThreadPool-0.0.1-SNAPSHOT.jar運(yùn)行后,輸出日志如下:

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

到此,關(guān)于“怎么使用Spring開發(fā)和監(jiān)控線程池服務(wù)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI