我正在尝试编写一个方法,该方法创建一个线程,该线程在此方法返回后确实有效。我需要这个线程在一定时间后超时。
我有一个可行的解决方案,但我不确定这是否是最好的方法。
new Thread(() -> {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Void> future = executor.submit(new Callable() {
public Void call() throws Exception {
workThatTakesALongTime();
});
try {
future.get(timeoutMillis, TimeUnit.MILLISECONDS);
} catch (Exception e) {
LOGGER.error("Exception from timeout.", e);
}
}).start();
有没有更好的方法可以在不使用线程中的执行器服务的情况下做到这一点?
有多种方法可以实现此目的。一种方法是,就像你所做的那样,使用ExecutorService。一种更简单的方法是创建一个新线程和一个队列,线程每隔几秒钟就会从中查看是否有内容。一个例子是这样的:
Queue<Integer> tasks = new ConcurrentLinkedQueue<>();
new Thread(){
public void run() throws Exception {
while(true){
Integer task = null;
if((task = tasks.poll()) != null){
// do whatever you want
}
Thread.sleep(1000L); // we probably do not have to check for a change that often
}
}
}.start();
// add tasks
tasks.add(0);
请参阅允许您传递超时值的ExecutorService.invokeAny()
方法。