Java Futrue模式簡單例子和使用場景

之前看視頻上別人講解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那種方式進行異步執行異步同步數據,通過補償機制解決潛在數據風險

 

 

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