Spring task executor同異步


1. spring提供了哪些任務執行器,是否有同步的任務執行器

有ThreadPoolTaskExecutor等執行器

同步可以用SyncTaskExecutor,但這個可以說不算一個線程池,因為還在原線程執行

也可以用ThreadPoolTaskExecutor結合FutureTask做到同步

此外還有

h1o2tbh5.vco

代碼:

/*
 * 文 件 名:  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執行的堆棧圖:

1gkmb0og.ay5

 

 

SyncTaskExecutor執行的堆棧圖:

a0hdylri.agr

 

此外線程池這種任務執行器在任務執行完主線程不會退出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM