java:在最长的时间段内执行一个方法

时间:2011-08-24 14:59:24

标签: java multithreading methods javamail

我正在使用JavaMail API,并且Folder类中有一个名为“search”的方法,有时执行时间太长。我想要的是在最长的时间段内执行此方法(例如最多15秒),这样我确信此方法不会超过15秒。

伪代码

messages = maximumMethod(Folder.search(),15);

我是否必须创建一个线程来执行此方法,并且在主线程中使用wait方法?

3 个答案:

答案 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)

你可以

  1. 标记当前时间
  2. 启动将在文件夹
  3. 中搜索的主题
  4. 当你得到结果(仍在线程中)时,如果当前时间超过1加15秒内获得的时间,则不要做任何事情。如果连接处于待处理状态,您将无法停止连接,但您可能只是迟到了迟到的结果。
  5. 另外,如果你有权访问用于搜索文件夹的套接字,你可以设置它的超时但我担心它会被javamail完全封装。

    此致  斯特凡

答案 2 :(得分:0)

此SO问题显示如何向客户端代码发送超时异常:How do I call some blocking method with a timeout in Java?

您可以使用Thread.interrupt()中断实际搜索,但这取决于方法的实现。您最终可能只是为了丢弃结果而完成操作。