簡體   English   中英

如何從主線程超時 java 線程?

[英]How to timeout a java thread from main Thread?

我剛開始使用 java 中的 ExecutorService、Future 和 Runnable 來設置線程超時。 我正在開發一個程序,我的主線程將調用另一個線程來解析 XML 文件,並且(出於安全目的)在一定時間后超時。 我已經谷歌搜索了幾個小時並閱讀了許多 StackOverFlow 線程,但我似乎根本無法讓主線程中斷輔助線程。 當我運行這個程序時,xml 解析器將 go 永遠解析大得離譜的文件,我似乎無法讓它被中斷。 任何幫助將不勝感激。 我的兩個線程的代碼如下。

public class xmlParser{
        private static class Parse implements Runnable {

                private final String xmlFile;

                public Parse(String xmlFile) {
                        this.xmlFile = xmlFile;
                }

                @Override
                public void run() {
                        try {
                                while (!Thread.interrupted()) {
                                        XMLReader xmlReader = XMLReaderFactory.createXMLReader();
                                        xmlReader.setContentHandler(new MyContentHandler());
                                        xmlReader.parse(new InputSource(xmlFile));
                        }
                }

                        catch (Exception e) {
                                System.err.println("TIMEOUT ERROR: Took too long to parse xml file.");
                                e.printStackTrace();

                        }
                }

        }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future future = executor.submit(new Parse(args[0]));
        try {
                future.get(1, TimeUnit.SECONDS);
        }
        catch (Exception e) {
                future.cancel(true);
        }
        finally {
                executor.shutdownNow();
        }

   }
}

注意:我知道 future.get(long timeout, TimeUnit unit) 會拋出多種類型的異常,稍后會處理。 目前,我只希望我的主線程在運行 1 秒后中斷 Parse 線程。

我試圖用一個更簡單的工作來重現:

static class FiveSecJob implements Callable<String> {
    @Override
    public  String call() {
        long t0 = System.currentTimeMillis();
        try {
            Thread.sleep(5000);
            return "success";
        } catch (Exception e) {
            System.out.println("interrupted after " + (System.currentTimeMillis() - t0) / 1000d + "s: " + e);
            return e.getMessage();
        }
    }
}
@Test
public void testTimeout() {
    ExecutorService executor = Executors.newSingleThreadExecutor();
    Future<String> future = executor.submit(new FiveSecJob());
    String s = "initial value";
    try {
        s = future.get(1, TimeUnit.SECONDS);
    } catch (Exception e) {
        System.out.println("cancelling future (" + e + ")");
        future.cancel(true);
    } finally {
        executor.shutdownNow();
    }
    System.out.println("s: " + s);
}

它似乎像intendend一樣取消了工作。 output 是:

cancelling future (java.util.concurrent.TimeoutException)
s: initial value
interrupted after 1.0s: java.lang.InterruptedException: sleep interrupted

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM