繁体   English   中英

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

[英]java : execute a method over a maximum period of time

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

伪代码

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

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

执行此操作的最佳方法是创建一个单线程执行程序 ,您可以使用它来提交callables。 返回值是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. 标记当前时间
  2. 启动将在该文件夹中搜索的线程
  3. 当你得到结果(仍然在线程中)时,如果当前时间超过1加15秒内获得的时间,则不要做任何事情。 如果连接处于待处理状态,您将无法停止连接,但您可能只是迟到了一个迟到的结果。

此外,如果您有权访问用于搜索文件夹的套接字,您可以设置其超时但我担心它将被javamail完全封装。

此致,Stéphane

这个SO问题显示了如何向客户端代码发送超时异常: 如何在Java中使用超时调用某些阻塞方法?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM