最近出现了一个用例,其中我必须同时启动几个阻塞的IO任务并按顺序使用它们。我不想更改使用方的操作顺序,并且由于这是一个Web应用程序,并且它们是请求路径中的短暂任务,所以我不想在固定线程池上遇到瓶颈,并希望镜像该线程。 .Net异步/等待编码风格。这样做FutureTask<>似乎很理想,但是需要一个ExecutorService。这是试图消除对一个的需要。
操作顺序:
完事
...
我想为每个线程生成一个新线程,FutureTask<>但是简化了线程管理。后run()完成,调用线程可以加入。
我想出的解决方案是:
包com.staples.search.util;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
public class FutureWrapper<T> extends FutureTask<T> implements Future<T> {
private Thread myThread;
public FutureWrapper(Callable<T> callable) {
super(callable);
myThread = new Thread(this);
myThread.start();
}
@Override
public T get() {
T val = null;
try {
val = super.get();
myThread.join();
}
catch (Exception ex)
{
this.setException(ex);
}
return val;
}
}
Run Code Online (Sandbox Code Playgroud)
这里有一对夫妇的JUnit测试我创建比较FutureWrapper来CachedThreadPool。
@Test
public …Run Code Online (Sandbox Code Playgroud)