如何避免线程中断异常

时间:2015-03-16 04:59:39

标签: java multithreading glassfish

我正在使用带有线程的Apache lucene索引pdf文件。有些线程花费的时间超过15分钟。线程执行15分钟后,它会抛出Thread中断的Exception。有没有办法增加时间限制以避免这个问题。

当有一个线程运行时,我得到了这个异常,并且它将近76%的pdf文件编入索引。 应用程序服务器是Glassfish


    List<Thread> threads = new ArrayList<Thread>();
    Thread worker;
    for (int a = 1;a <= count; a++) {

        IndexManualRunnable indexManualRunnable =
                new IndexManualRunnable(indexfileLocation, collections, manual, processId);
        worker = new Thread(indexManualRunnable);

        worker.setName(manual.getName());
        worker.setPriority(Thread.MAX_PRIORITY);
        worker.start();

        threads.add(worker);
    }

        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException interruptedException) {

                saveReport("", "", "Interrupted Exception", 1, processId, Category.INDEXING, thread.getName());
                interruptedException.printStackTrace();
            }
        }

2 个答案:

答案 0 :(得分:1)

<强>更新

我看到你正在使用Glassfish并且说每次15分钟都会发生这种中断。看起来Glassfish设置为在900秒左右超时,默认情况下为15分钟 - 这会引发InterruptException。

由于您的应用程序需要处理超过15分钟,因此请将以下服务器配置更新为您认为合适的时间限制。

http.request-timeout-seconds

这是一个用于更新属性的asadmin命令示例,但我还没有对其进行测试:

 # asadmin set server-config.network-config.protocols.protocol.<listener-name>.http.request-timeout-seconds=-1

- NOTE: <listener-name> is the name of the listener they wish to disable the  timeout on.

 - (-1) means unlimited

要处理中断的线程,您可以自己捕获并处理异常。如果你想让线程继续执行,无论你理论上什么都不做 - 但为了保持代码清洁和正确,我将按如下方式实现:

boolean interrupted = false;
try {
    while (true) {
        try {
            return queue.take();
        } catch (InterruptedException e) {
            interrupted = true;
            // fall through and retry
        }
    }
} finally {
    if (interrupted)
        Thread.currentThread().interrupt();
}

我喜欢这个例子,因为它不只是留下一个空的catch子句,而是保留了它在一个布尔值中被调用的事实。它这样做,以便当它最终完成时,您可以检查它是否被中断,如果是这样,请尊重它并中断当前线程。

有关更多信息以及示例的来源,请参阅以下文章: http://www.ibm.com/developerworks/library/j-jtp05236/

答案 1 :(得分:0)

更改Glassfish中的domain.xml

      <thread-pools>
        <thread-pool name="http-thread-pool" idle-thread-timeout-seconds="1800" />
        <thread-pool max-thread-pool-size="200" name="thread-pool-1" idle-thread-timeout-seconds="1800" />
      </thread-pools> 

增加idle-thread-timeout-seconds