1. 程式人生 > >Scala 非同步程式設計之 Future (二)

Scala 非同步程式設計之 Future (二)

上篇部落格講了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 void 
main(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 result
try { 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等回撥能充分地利用多核。