Scala 非同步程式設計之 Future (二)
阿新 • • 發佈:2018-10-31
上篇部落格講了scala中的Future,實際上java 在jdk1.5後增加了callable,也實現了Future,以《Netty In Action》中的程式碼為例,看一下java中Future的實現:
import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class FutureViaJdkExample { public static voidmain(String[] args)throws Exception { ExecutorService executor = Executors.newCachedThreadPool(); Runnable task1 = new Runnable() { @Override public void run() { // do some heavy work try { Thread.sleep(1000 * 1);} catch (InterruptedException e) { e.printStackTrace(); } } }; Callable<Integer> task2 = new Callable<Integer>() { @Override public Integer call() throws Exception { // do some heavy work with resulttry { Thread.sleep(1000 * 2); } catch (InterruptedException e) { e.printStackTrace(); } return 0; } }; Future<?> future1 = executor.submit(task1); Future<Integer> future2 = executor.submit(task2); while(!future1.isDone() || !future2.isDone()) { System.out.println("do something else..."); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("future2 value : "+future2.get()); executor.shutdown(); } }
future1是executor提交了runnable的任務,介面如下:
Future<?> submit(Runnable task);
而future2提交了callable的任務
<T> Future<T> submit(Callable<T> task);
submit實現了過載,對於第二種submit的具體實現如下:
public <T> Future<T> submit(Runnable task, T result) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task, result); execute(ftask); return ftask; } RunnableFuture介面繼承了Runnable和Future介面,因此我們可以通過run()方法執行callable的程式碼,通過future獲取返回值。但是java的Future只能通過阻塞等待結果,而scala中的Oncomplete,OnSuccess等回撥能充分地利用多核。