題記 : 最近再看公司的代碼中,看到有使用 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中獲取就可以.