1. spring提供了哪些任務執行器,是否有同步的任務執行器
有ThreadPoolTaskExecutor等執行器
同步可以用SyncTaskExecutor,但這個可以說不算一個線程池,因為還在原線程執行
也可以用ThreadPoolTaskExecutor結合FutureTask做到同步
此外還有
代碼:
/* * 文 件 名: Test000101.java * 版 權: . Copyright 2008-2015, All rights reserved Information Technology Co.,Ltd. * 描 述: <描述> * 修 改 人: chen.simon * 修改時間: 2016-5-11 */ package org.simonme.mt.demo; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.task.TaskExecutor; /** * <一句話功能簡述> <功能詳細描述> * * @author Chenxiaguang * @version [版本號, 2016-5-11] * @see [相關類/方法] * @since [產品/模塊版本] */ public class Test000101 { public static void main(String[] args) { execute(provideThreadPoolTaskExecutor()); execute(provideSyncTaskExecutor()); } /** <一句話功能簡述> * <功能詳細描述> * @see [類、類#方法、類#成員] */ private static void execute(TaskExecutor taskESExecutor) { System.out.println(taskESExecutor); Callable<String> run = new Callable<String>() { public String call() { return runTask(); } }; FutureTask<String> task = new FutureTask<String>(run); taskESExecutor.execute(task); System.out.println("Before get"); /** * 下面的get 利用了FutureTask的阻塞特性,使得主線程等待 TaskExecutor異步執行完后拿到結果<br/> * 此處雖說用的是異步的TaskExecutor,但是拿結果的動作還是同步的<br/> */ try { task.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println("After get"); } public static TaskExecutor provideThreadPoolTaskExecutor() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-0001.xml"); TaskExecutor taskESExecutor000101 = (TaskExecutor)applicationContext.getBean("taskESExecutor000101"); return taskESExecutor000101; } public static TaskExecutor provideSyncTaskExecutor() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-0001.xml"); TaskExecutor taskESExecutor000102 = (TaskExecutor)applicationContext.getBean("taskESExecutor000102"); return taskESExecutor000102; } private static String runTask() { try { Thread.sleep(2 * 1000l); } catch (InterruptedException e) { e.printStackTrace(); } String result = "Finish"; System.out.println(result); return result; } }
<?xml version="1.0" encoding="UTF-8"?> <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" default-autowire="byName" default-lazy-init="false"> <bean id="taskESExecutor000101" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="10" /> <property name="maxPoolSize" value="50" /> <property name="queueCapacity" value="500" /> <property name="keepAliveSeconds" value="300" /> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy" /> </property> </bean> <bean id="taskESExecutor000102" class="org.springframework.core.task.SyncTaskExecutor"> </bean> </beans>
2. SyncTaskExecutor與ThreadPoolTaskExecutor區別
前者是同步執行器,執行任務同步,見下圖,還在主線程上
后者是線程池,執行任務異步,見下圖,在另外的線程上
ThreadPoolTaskExecutor執行的堆棧圖:
SyncTaskExecutor執行的堆棧圖:
此外線程池這種任務執行器在任務執行完主線程不會退出。