記一次FutureTask的簡單的使用

題記 : 最近再看公司的代碼中,看到有使用 FutureTask的操作.於是就自己看了一下並且做一個簡單的記錄。


FutureTask來創建多線程任務,並且獲取任務的結果

Callable:  這是一個接口類,並且只提供了一個call方法.

 

 MyTask類 : 

package com.yang.threadspringcase.task;

/*
 *@author:BaoYang
 *@Date: 2020/2/24
 *@description:
 */

import java.util.concurrent.Callable;

public class MyTask implements Callable<Object>
{

    private String param1;
    private String param2;

    public MyTask(String param1, String param2)
    {
        this.param1 = param1;
        this.param2 = param2;
    }

    @Override
    public Object call() throws Exception
    {
        for(int i=0;i<100;i++){
            System.out.println(param1 + param2 + i);
        }

        try{
            Thread.sleep(2000);
        }catch (Exception e){
            e.printStackTrace();
        }

        return true;
    }
}

 

MyTaskMain類 
package com.yang.threadspringcase.task;

/*
 *@author:BaoYang
 *@Date: 2020/2/24
 *@description:
 */

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class MyTaskMain
{
    public static void main(String[] args)
    {
        MyTask myTask = new MyTask("Gavin","Yang");

        // 異步回調等待結果
        FutureTask<Object> futureTask = new FutureTask<>(myTask);
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        cachedThreadPool.submit(futureTask);
        cachedThreadPool.shutdown();

        // Thread thread = new Thread(futureTask);
        // thread.start();

        try {
            // 如果 futureTask沒有執行完的話,就是需要等待結果
            System.out.println("等待之前的處理哈哈哈h");
            boolean result = (boolean) futureTask.get();
            System.out.println("返回的Result結果是 ---> " + result);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

 

MyTaskManyMain類:
package com.yang.threadspringcase.task;

/*
 *@author:BaoYang
 *@Date: 2020/2/24
 *@description:
 */

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class MyTaskManyMain
{

    public static void main(String[] args)
    {
        long startTime = System.currentTimeMillis();

        List<FutureTask<Object>> futureTasks = new ArrayList<>();
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for(Integer i=0;i<10;i++){
            MyTask myTask = new MyTask(i.toString(),i.toString());
            futureTasks.add(new FutureTask<>(myTask));
            // cachedThreadPool.submit(new FutureTask<>(myTask));
        }
        for(FutureTask<Object> futureTask:futureTasks){
            cachedThreadPool.submit(futureTask);
        }

        cachedThreadPool.shutdown();
        for(Integer i=0;i<10;i++){
            try{
                boolean reuslt = (boolean) futureTasks.get(0).get();
                System.out.println("The " + i + "個執行的結果" + reuslt);
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        long endTime = System.currentTimeMillis();
        System.out.println("消耗的時間是 ---> " + (endTime - startTime));
    }

}

在MyTask中的call方法中,可以看到,在循環完了後,有進行休眠等待(模擬業務需要的耗時操作功能)

在 MyTaskMain中可以清楚的看到,

返回的Result結果是 --->

打印這句話是在Thread.sleep的時間後打印出來出來的,說明當線程執行到get就進行等待來獲取結果(這裏目前可以理解爲程序在這裏進行了阻塞)。

 

在 MyTaskManyMain 中可以看到,多個線程同時執行,整個執行結果的耗時是只需要一個線程的耗時(這裏就可以看出多線程的優點,在處理方面和耗時上可以看出來)

 


然後看到線程池這塊,有交給Spring來進行管理的.

package com.yang.threadspringcase.config;

/*
 *@author:BaoYang
 *@Date: 2020/2/24
 *@description:
 * Main : Spring啓動時自動加載一個ExecutorService對象.
 *
 */

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Configuration
public class ThreadPoolConfig
{
    @Bean
    public ExecutorService getThreadPool(){
        return Executors.newCachedThreadPool();
    }

}

然後用到的時候,從Spring中獲取就可以.

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章