未來和可卡通

我們可以使用 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 中儲存的資料,我們將阻塞執行緒直到任務完成。如果你希望儘快執行此操作,請注意此類呼叫