簡體   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