paulwong

          FutureTask and ThreadPoolExecutor

          用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;
              }

          }

          模擬客戶(hù)端提交的線(xiàn)程
          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ù)并提交到線(xiàn)程池中:" + 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.xsd
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
          http://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&amp;characterEncoding=UTF-8&amp;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">

          <!-- 核心線(xiàn)程數(shù),默認(rèn)為1 -->
          <property name="corePoolSize" value="10" />

          <!-- 最大線(xiàn)程數(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" />
          -->

          <!-- 線(xiàn)程池維護(hù)線(xiàn)程所允許的空閑時(shí)間,默認(rèn)為60s -->
          <property name="keepAliveSeconds" value="300" />

          <!-- 線(xiàn)程池對(duì)拒絕任務(wù)(無(wú)線(xiàn)程可用)的處理策略,目前只支持AbortPolicy、CallerRunsPolicy;默認(rèn)為后者 -->
          <property name="rejectedExecutionHandler">
          <!-- AbortPolicy:直接拋出java.util.concurrent.RejectedExecutionException異常 -->
          <!-- CallerRunsPolicy:主線(xiàn)程直接執(zhí)行該任務(wù),執(zhí)行完之后嘗試添加下一個(gè)任務(wù)到線(xiàn)程池中,可以有效降低向線(xiàn)程池內(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;

          @ContextConfiguration
          public 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è)線(xiàn)程池
          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();
          }


          }


          }

          posted on 2011-12-07 15:48 paulwong 閱讀(2704) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): 性能優(yōu)化

          Feedback

          # re: FutureTask and ThreadPoolExecutor 2014-03-11 23:41 最代碼

          你好,我根據(jù)你的博客整理了分享了一份代碼:http://www.zuidaima.com/share/1724478138158080.htm
          并且發(fā)現(xiàn)你代碼中有些紕漏都修改過(guò)來(lái)了。  回復(fù)  更多評(píng)論   


          主站蜘蛛池模板: 库尔勒市| 平远县| 嘉善县| 潼关县| 革吉县| 拉孜县| 东明县| 彰武县| 罗定市| 仙居县| 兴文县| 满洲里市| 长沙县| 安康市| 三河市| 阿瓦提县| 尉犁县| 离岛区| 盈江县| 黎平县| 宁明县| 宾阳县| 涡阳县| 延寿县| 鹤岗市| 嘉义市| 桂林市| 黎城县| 左云县| 宜兰市| 宁陵县| 阿图什市| 云安县| 化隆| 寻乌县| 普兰县| 邯郸县| 嫩江县| 永嘉县| 阜阳市| 宁强县|