我正在使用JavaMail API
,并且Folder类中有一个名为“search”的方法,有时执行时间太长。我想要的是在最长的时间段内执行此方法(例如最多15秒),这样我确信此方法不会超过15秒。
伪代码
messages = maximumMethod(Folder.search(),15);
我是否必须创建一个线程来执行此方法,并且在主线程中使用wait方法?
答案 0 :(得分:5)
执行此操作的最佳方法是创建单个线程executor,您可以使用该线程提交callable。返回值为Future<?>
,您可以从中获取结果。你也可以说等这么久才能得到结果。以下是示例代码:
ExecutorService service = Executors.newSingleThreadExecutor();
Future<Message[]> future = service.submit(new Callable<Message[]>() {
@Override
public Message[] call() throws Exception {
return Folder.search(/*...*/);
}
});
try {
Message[] messages = future.get(15, TimeUnit.SECONDS);
}
catch(TimeoutException e) {
// timeout
}
答案 1 :(得分:1)
你可以
另外,如果你有权访问用于搜索文件夹的套接字,你可以设置它的超时但我担心它会被javamail完全封装。
此致 斯特凡
答案 2 :(得分:0)
此SO问题显示如何向客户端代码发送超时异常:How do I call some blocking method with a timeout in Java?
您可以使用Thread.interrupt()
中断实际搜索,但这取决于方法的实现。您最终可能只是为了丢弃结果而完成操作。