Java并發(fā)工具類Future使用示例
前言
Future是一個接口類,定義了5個方法:
boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
通過這5個方法可以看出,F(xiàn)uture不但可以獲取提交任務(wù)的執(zhí)行結(jié)果,甚至還可以取消任務(wù)。
Future使用示例
摘自JDK中Future示例代碼
class ArchiveSearcherImpl implements ArchiveSearcher{ @Override public String search(String target) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return target; } } interface ArchiveSearcher { String search(String target); } class App { public static void main(String[] args) throws InterruptedException { App app = new App(); app.showSearch("search"); } ExecutorService executor = Executors.newSingleThreadExecutor(); ArchiveSearcher searcher = new ArchiveSearcherImpl(); void showSearch(final String target) throws InterruptedException { // 提交任務(wù) Future<String> future = executor.submit(new Callable<String>() { public String call() { return searcher.search(target); } }); displayOtherThings(); // do other things while searching try { // 拿任務(wù)執(zhí)行結(jié)果 displayText(future.get()); // use future } catch (ExecutionException ex) { //cleanup(); return; } } private void displayOtherThings() { System.out.println("do other things"); } private void displayText(String s) { System.out.println(s); } }
注意:future.get()
方法是阻塞式的,如果調(diào)用該方法的時候任務(wù)尚未執(zhí)行完成,則會一直等待下去,直到任務(wù)執(zhí)行結(jié)束。
ExecutorService還有一個sumbit方法比較特殊:<T> Future<T> submit(Runnable task, T result);
這個方法可以先把result這個參數(shù)傳給task使用,然后再通過get方法把result返回。
public class FutureTest { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executor = Executors.newSingleThreadExecutor(); MyResult myResult = new MyResult(); MyTask myTask = new MyTask(myResult); // 提交任務(wù)后,在任務(wù)中操作myResult Future<MyResult> future = executor.submit(myTask, myResult); // 最后get方法可以拿到myResult System.out.println(future.get()); } } class MyTask implements Runnable { private MyResult myResult; public MyTask(MyResult myResult) { this.myResult = myResult; } @Override public void run() { myResult.setCode("10000"); } } @Data @ToString class MyResult { private String code; }
FutureTask
FutureTask是一個實現(xiàn)了Runnable和Future接口的工具類,結(jié)合了這兩個接口的能力,F(xiàn)utureTask即可以提交給線程任務(wù)執(zhí)行,又可以獲取到執(zhí)行結(jié)果。
具體代碼示例:
import java.util.concurrent.*; public class FutureTaskTest { public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<String> futureTask1 = new FutureTask<>(new MyTask1()); FutureTask<String> futureTask2 = new FutureTask<>(new MyTask2()); ExecutorService executorService = Executors.newFixedThreadPool(2); executorService.submit(futureTask1); executorService.submit(futureTask2); long start = System.currentTimeMillis(); System.out.println(futureTask1.get()); System.out.println(futureTask2.get()); long end = System.currentTimeMillis(); System.out.println(end - start); } } class MyTask2 implements Callable<String> { @Override public String call() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return "MyTask2 over"; } } class MyTask1 implements Callable<String> { @Override public String call() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return "MyTask1 over"; } }
到此這篇關(guān)于Java并發(fā)工具類Future使用示例的文章就介紹到這了,更多相關(guān)Java并發(fā)工具類Future內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Spring DeferredResult異步操作使用場景
本文主要介紹了Spring DeferredResult異步操作使用場景,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10Spring?MVC中JSON數(shù)據(jù)處理方式實戰(zhàn)案例
Spring MVC是個靈活的框架,返回JSON數(shù)據(jù)的也有很多五花八門的方式,下面這篇文章主要給大家介紹了關(guān)于Spring?MVC中JSON數(shù)據(jù)處理方式的相關(guān)資料,需要的朋友可以參考下2024-01-01Java基礎(chǔ)之淺談hashCode()和equals()
今天給大家?guī)淼氖顷P(guān)于Java基礎(chǔ)的相關(guān)知識,文章圍繞著hashCode()和equals()展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Java?8函數(shù)式接口之BinaryOperator使用示例詳解
這篇文章主要大家介紹了Java?8函數(shù)式接口之BinaryOperator,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Spring Boot 直接用jar運(yùn)行項目的方法
這篇文章主要介紹了Spring Boot 直接用jar運(yùn)行項目的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下2018-02-02