未來和可卡通
我們可以使用 Threadpools 的一個特性是 submit()
方法,它允許我們知道執行緒何時完成他的工作。我們可以通過 Future
物件來做到這一點,該物件從 Callable 中返回一個物件,我們可以將它們用於我們自己的目標。
以下是有關如何使用 Callable 例項的示例:
public class CallablesExample{
//Create MyCustomCallable instance
List<Future<String>> mFutureList = new ArrayList<Future<String>>();
//Create a list to save the Futures from the Callable
Callable<String> mCallable = new MyCustomCallable();
public void main(String args[]){
//Get ExecutorService from Executors utility class, Creating a 5 threads pool.
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 100; i++) {
//submit Callable tasks to be executed by thread pool
Future<String> future = executor.submit(mCallable);
//add Future to the list, we can get return value using Future
mFutureList.add(future);
}
for (Future<String> fut : mFutureList) {
try {
//Print the return value of Future, Notice the output delay in console
//because Future.get() stop the thread till the task have been completed
System.out.println(new Date() + "::" + fut.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
//Shut down the service
executor.shutdown();
}
class MyCustomCallable implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(1000);
//return the thread name executing this callable task
return Thread.currentThread().getName();
}
}
}
如你所見,我們建立了一個包含 5 個 Threads 的 Threadpool,這意味著我們可以並行丟擲 5 個 callables。當執行緒完成時,我們將從 callable 獲取和 Future 物件,在這種情況下是執行緒的名稱。
警告
在這個例子中,我們只使用 Futures 作為陣列中的物件來了解我們正在執行的執行緒數,並使用我們想要的資料多次列印登入控制檯。但是,如果我們想使用方法 Future.get()
,為了返回我們之前在 callable 中儲存的資料,我們將阻塞執行緒直到任務完成。如果你希望儘快執行此操作,請注意此類呼叫