未来和可卡通

我们可以使用 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 中保存的数据,我们将阻塞线程直到任务完成。如果你希望尽快执行此操作,请注意此类调用