国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > Java > 正文

Spring線程池ThreadPoolExecutor配置并且得到任務(wù)執(zhí)行的結(jié)果

2024-07-14 08:43:47
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

用ThreadPoolExecutor的時(shí)候,又想知道被執(zhí)行的任務(wù)的執(zhí)行情況,這時(shí)就可以用FutureTask。

ThreadPoolTask

package com.paul.threadPool;import java.io.Serializable;import java.util.concurrent.Callable;public class ThreadPoolTask implements Callable<String>, Serializable {  private static final long serialVersionUID = 0;  // 保存任務(wù)所需要的數(shù)據(jù)  private Object threadPoolTaskData;  private static int consumeTaskSleepTime = 2000;  public ThreadPoolTask(Object tasks) {    this.threadPoolTaskData = tasks;  }  public synchronized String call() throws Exception {    // 處理一個(gè)任務(wù),這里的處理方式太簡(jiǎn)單了,僅僅是一個(gè)打印語(yǔ)句    System.out.println("開(kāi)始執(zhí)行任務(wù):" + threadPoolTaskData);    String result = "";    // //便于觀察,等待一段時(shí)間    try {//      long r = 5/0;      for ( int i= 0 ; i< 100000000 ; i++){        }       result = "OK";    } catch (Exception e) {      e.printStackTrace();      result = "ERROR";    }    threadPoolTaskData = null;    return result;  }}

模擬客戶端提交的線程

package com.paul.threadPool;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;public class StartTaskThread implements Runnable{ private ThreadPoolTaskExecutor threadPoolTaskExecutor; private int i; public StartTaskThread(ThreadPoolTaskExecutor threadPoolTaskExecutor,int i) { this.threadPoolTaskExecutor = threadPoolTaskExecutor; this.i = i; } @Override public synchronized void run() { String task = "task@ " + i; System.out.println("創(chuàng)建任務(wù)并提交到線程池中:" + task); FutureTask<String> futureTask = new FutureTask<String>( new ThreadPoolTask(task)); threadPoolTaskExecutor.execute(futureTask); // 在這里可以做別的任何事情 String result = null; try { // 取得結(jié)果,同時(shí)設(shè)置超時(shí)執(zhí)行時(shí)間為0.1秒。同樣可以用future.get(),不設(shè)置執(zhí)行超時(shí)時(shí)間取得結(jié)果 result = futureTask.get(); } catch (InterruptedException e) { futureTask.cancel(true); } catch (ExecutionException e) { futureTask.cancel(true); } catch (Exception e) { futureTask.cancel(true); // 超時(shí)后,進(jìn)行相應(yīng)處理 } finally { System.out.println("task@" + i + ":result=" + result); }}

SPRING配置文件

<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <!-- 配置數(shù)據(jù)源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/mb_main?useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true" p:username="root" p:password="1234" /> <!-- 配置Jdbc模板 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource" /> <!-- 事務(wù)管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" /> <tx:advice id="jdbcTxAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" /> </tx:attributes> </tx:advice> <!-- 使用aop/tx命名空間配置事務(wù)管理,這里對(duì)service包下的服務(wù)類(lèi)方法提供事務(wù) --> <aop:config> <aop:pointcut id="jdbcServiceMethod" expression="within(com.baobaotao.service..*)" /> <aop:advisor pointcut-ref="jdbcServiceMethod" advice-ref="jdbcTxAdvice" /> </aop:config> <!-- 配置dao  <bean id="loginLogDao" class="com.baobaotao.dao.LoginLogDao" p:jdbcTemplate-ref="jdbcTemplate" /> <bean id="userDao" class="com.baobaotao.dao.UserDao" p:jdbcTemplate-ref="jdbcTemplate" /> <bean id="userService" class="com.baobaotao.service.UserService" p:userDao-ref="userDao" p:loginLogDao-ref="loginLogDao" /> --> <bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 核心線程數(shù),默認(rèn)為1 --> <property name="corePoolSize" value="10" /> <!-- 最大線程數(shù),默認(rèn)為Integer.MAX_VALUE --> <property name="maxPoolSize" value="50" /> <!-- 隊(duì)列最大長(zhǎng)度,一般需要設(shè)置值>=notifyScheduledMainExecutor.maxNum;默認(rèn)為Integer.MAX_VALUE  <property name="queueCapacity" value="1000" /> --> <!-- 線程池維護(hù)線程所允許的空閑時(shí)間,默認(rèn)為60s --> <property name="keepAliveSeconds" value="300" /> <!-- 線程池對(duì)拒絕任務(wù)(無(wú)線程可用)的處理策略,目前只支持AbortPolicy、CallerRunsPolicy;默認(rèn)為后者 --> <property name="rejectedExecutionHandler"> <!-- AbortPolicy:直接拋出java.util.concurrent.RejectedExecutionException異常 --> <!-- CallerRunsPolicy:主線程直接執(zhí)行該任務(wù),執(zhí)行完之后嘗試添加下一個(gè)任務(wù)到線程池中,可以有效降低向線程池內(nèi)添加任務(wù)的速度 --> <!-- DiscardOldestPolicy:拋棄舊的任務(wù)、暫不支持;會(huì)導(dǎo)致被丟棄的任務(wù)無(wú)法再次被執(zhí)行 --> <!-- DiscardPolicy:拋棄當(dāng)前任務(wù)、暫不支持;會(huì)導(dǎo)致被丟棄的任務(wù)無(wú)法再次被執(zhí)行 --> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /> </property> </bean></beans>

測(cè)試類(lèi)

package com.paul.threadPool;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;@ContextConfigurationpublic class TestThreadPool extends AbstractJUnit4SpringContextTests{ private static int produceTaskSleepTime = 10; private static int produceTaskMaxNumber = 1000; @Autowired private ThreadPoolTaskExecutor threadPoolTaskExecutor; public ThreadPoolTaskExecutor getThreadPoolTaskExecutor() { return threadPoolTaskExecutor; } public void setThreadPoolTaskExecutor( ThreadPoolTaskExecutor threadPoolTaskExecutor) { this.threadPoolTaskExecutor = threadPoolTaskExecutor; } @Test public void testThreadPoolExecutor() { // 構(gòu)造一個(gè)線程池 final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 600, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3), new ThreadPoolExecutor.CallerRunsPolicy()); for (int i = 1; i <= produceTaskMaxNumber; i++) { try { Thread.sleep(produceTaskSleepTime); } catch (InterruptedException e1) { e1.printStackTrace(); } new Thread(new StartTaskThread(threadPoolTaskExecutor,i)).start(); } }}

項(xiàng)目截圖(基于maven構(gòu)建)

Spring,線程池,ThreadPoolExecutor,任務(wù)執(zhí)行

運(yùn)行截圖:

Spring,線程池,ThreadPoolExecutor,任務(wù)執(zhí)行

如果遇到cpu忙執(zhí)行超過(guò)1秒的會(huì)返回null

Spring,線程池,ThreadPoolExecutor,任務(wù)執(zhí)行

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 中西区| 闻喜县| 乌海市| 阆中市| 晋城| 孟村| 昭通市| 金秀| 邵东县| 大埔县| 西青区| 合江县| 临邑县| 衡水市| 泰州市| 仲巴县| 东乌珠穆沁旗| 额尔古纳市| 弥勒县| 太康县| 靖江市| 奉节县| 石渠县| 延长县| 福海县| 惠州市| 体育| 镇坪县| 日土县| 虹口区| 麻阳| 贵溪市| 尼木县| 浦江县| 镇原县| 深州市| 苏尼特右旗| 邓州市| 福清市| 汪清县| 柳林县|