如何从可调用接口 return 未来对象(executorService.submit 的内部工作)
How to return future object from callable interface (internal working of executorService.submit)
我试图了解当 运行 executorService.submit(Callable);
时如何创建未来对象
例如,假设我创建了一个线程池,我在其中传递了我的 callable
实现
class FactorialCalculator implements Callable<Long> {
private int number;
public FactorialCalculator(int number) {
this.number = number;
}
@Override
public Long call() throws Exception {
return (number*number);
}
}
我想要 return 未来对象,这样我就可以从调用函数中获取 return 值。我的自定义线程池看起来像
class MyThreadPool implements java.util.concurrent.Executor
{
private final java.util.concurrent.BlockingQueue<Callable> queue;
public MyThreadPool(int numThreads) {
queue = new java.util.concurrent.LinkedBlockingQueue<>();
for (int i=0 ; i<numThreads ; i++) {
new Thread(new Runnable(){
@Override
public void run() {
while(true) {
queue.take().call();
}
}
}).start();
}
}
@Override
public void submit(Callable command) {
queue.put(command);
}
}
现在如果我这样做
MyThreadPool mypool = new MyThreadPool(10);
mypool.submit(new FactorialCalculator(10));
我想将方法提交给 return 未来,这样我就可以在线程完成执行时检查 return 值。我如何 return 未来的对象。
最简单的方法是将可调用对象包装在 FutureTask 中:
@Override
public <T> Future<T> submit(Callable<T> callable) {
FutureTask<T> future = new FutureTask(callable);
queue.put(future);
return future;
}
当然,更简单的解决方案是使用Executors.newFixedThreadPool
而不是自己重新实现它。
我试图了解当 运行 executorService.submit(Callable);
例如,假设我创建了一个线程池,我在其中传递了我的 callable
实现class FactorialCalculator implements Callable<Long> {
private int number;
public FactorialCalculator(int number) {
this.number = number;
}
@Override
public Long call() throws Exception {
return (number*number);
}
}
我想要 return 未来对象,这样我就可以从调用函数中获取 return 值。我的自定义线程池看起来像
class MyThreadPool implements java.util.concurrent.Executor
{
private final java.util.concurrent.BlockingQueue<Callable> queue;
public MyThreadPool(int numThreads) {
queue = new java.util.concurrent.LinkedBlockingQueue<>();
for (int i=0 ; i<numThreads ; i++) {
new Thread(new Runnable(){
@Override
public void run() {
while(true) {
queue.take().call();
}
}
}).start();
}
}
@Override
public void submit(Callable command) {
queue.put(command);
}
}
现在如果我这样做
MyThreadPool mypool = new MyThreadPool(10);
mypool.submit(new FactorialCalculator(10));
我想将方法提交给 return 未来,这样我就可以在线程完成执行时检查 return 值。我如何 return 未来的对象。
最简单的方法是将可调用对象包装在 FutureTask 中:
@Override
public <T> Future<T> submit(Callable<T> callable) {
FutureTask<T> future = new FutureTask(callable);
queue.put(future);
return future;
}
当然,更简单的解决方案是使用Executors.newFixedThreadPool
而不是自己重新实现它。