之前看視頻上別人講解java的Futrue功能可以提高系統運行效率,之後有一點疑惑,通過一個簡單的例子瞭解Futrue到底好處在哪。
例子很簡單,通過一個線程池來讓子線程去執行任務,主線程打印一句話後調用futrue的get()方法。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.concurrent.*;
@RunWith(SpringRunner.class)
@SpringBootTest(classes={MyTest.class})// 指定啓動類
public class MyTest {
ThreadPoolExecutor pool = new ThreadPoolExecutor(5,10,30, TimeUnit.MINUTES,new ArrayBlockingQueue<Runnable>(10));
@Test
public void test() throws Exception {
MyTest myTest = new MyTest();
CallableThreads callableThreads = new CallableThreads();
Future<Integer> submit = myTest.pool.submit(callableThreads);
System.out.println("主線程讓子線程執行費時操作了,自己又往下走了");
Thread.sleep(2000);
System.out.println("子線程返回值:"+submit.get());
System.out.println("主線程結束");
}
}
class CallableThreads implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName());
Thread.sleep(5000);
return new Integer(1);
}
}
結果如圖所示,主線程開啓子線程後自己又向下執行,遇到submit後阻塞,直到子線程執行完畢返回結果。
去掉主線程中的:
結果直接結束,看來submit()是關鍵。
由此得知,Futrue提高系統執行效率 指的是發揮CPU的多核併發能力,對於併發低的情況並沒有太大突出特點
實際中如果要用的話,我認爲最好放到費時業務之前,或者將費時業務拆分成多個子業務,然後分別利用futrue開啓,主線程只負責等他們全部執行完畢後返回結果。
但是對於前臺要求快速返回結果的情況,也沒必要非要用futrue,可以採取MQ那種方式進行異步執行異步同步數據,通過補償機制解決潛在數據風險