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