我正在尝试编写一个创建线程的方法,该方法在该方法返回后才起作用。我需要该线程在一定时间后超时。
我有一个可行的解决方案,但是我不确定这是否是最好的方法。
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的更好方法?
答案 0 :(得分:0)
有多种方法可以实现此目的。 一种方法是像您一样使用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);
答案 1 :(得分:0)
请参见允许您传递超时值的ExecutorService.invokeAny()
方法。