Java 主进程因线程抛出异常而挂起

标签 java multithreading

主要流程:

            int cpus = Runtime.getRuntime().availableProcessors();
            ExecutorService executor = Executors.newFixedThreadPool(cpus);
            List<Callable<Object>> todo = new ArrayList<Callable<Object>>(lines.size());
            for (int r = 0; r < lines.size(); r++) {
                String filename = r + 1 + "";
                todo.add(Executors.callable(new AppConsole(filename, lines.get(r))));
            }
            List<Future<Object>> answers = executor.invokeAll(todo);

AppConsole类实现了Runnable,重写的run方法如下:

public void run() {
  try{



  } catch (SecurityException exception) {
            exception.printStackTrace();
        } catch (FileNotFoundException exception) {
            exception.printStackTrace();
        } catch (IOException exception) {
            exception.printStackTrace();
        } catch (SAXException exception) {
            exception.printStackTrace();
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            if (output != null) {
                output.close();
            }
        }
  }

}

由于其中一个线程抛出连接超时异常,主进程已挂起且无法完成。现在我可以看到 cpu 使用率下降到 0%,并且内存消耗在挂起时保持在相同水平。

有人可以帮我解决这个问题吗?至少,帮我完成主要流程吧?

最佳答案

抛出异常会释放任务和主线程。 ExecutorService 将异常抛出视为另一个返回值,并且处理它不会出现问题。

主线程只会阻塞等待任务之一完成。我会查看仍然处于 Activity 状态的任务/线程,以了解它们正在做什么,例如也许它们还没有超时。

关于Java 主进程因线程抛出异常而挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18075277/

相关文章:

java - 如何在 JVM 中持久化变量

c++ - C++ 中单例的线程安全惰性构造

java - 任务恢复InterruptionException但无法在Thread中捕获

python - 为什么将 list() 包裹在 map 周围会导致函数运行?

java - 从父类(super class)访问隐藏变量

java - 如何在 .jar 文件中检查 Log4j 的版本号?

java - NFC enableForegroundDispatch 崩溃应用程序

java - 如何在postgres中获取2个时间戳之间的所有数据。

c - 如何有效地多线程算法?

java - IOException - read end dead - 在此示例中导致它的原因以及如何修复它 - Java 中的多线程应用程序