java - 线程抛出 RuntimeException - 对线程池的影响

标签 java threadpool

我刚刚读了this article并认为如果 Runnable 抛出异常并退出,线程池可能会用完工作线程。我做了一个小代码并进行了检查,但池大小没有变化。

public class ThreadPoolTest {

public static void main(String[] args) throws InterruptedException {
    ThreadPoolExecutor tp = new ThreadPoolExecutor(1, 1, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1));
    Thread.sleep(1000);
    System.out.println(tp.getPoolSize());
    tp.execute(new Runnable(){

        @Override
        public void run() {
            System.out.println("Executing & Throwing");
            throw new NullPointerException();
        }

    });
    Thread.sleep(1000);
    System.out.println(tp.getPoolSize());
    tp.execute(new Runnable(){

        @Override
        public void run() {
            System.out.println("Executing & Throwing");
            throw new NullPointerException();
        }

    });
    Thread.sleep(1000);
    System.out.println(tp.getPoolSize());
    tp.shutdown();
}

我得到的输出是

0
Exception in thread "pool-1-thread-1" java.lang.NullPointerException
    at threads.ThreadPoolTest$1.run(ThreadPoolTest.java:18)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Executing & Throwing
1
Exception in thread "pool-1-thread-2" java.lang.NullPointerException
    at threads.ThreadPoolTest$2.run(ThreadPoolTest.java:29)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Executing & Throwing
1

这是在 Java 7 上。是否有文章中所述的易受攻击的 java 线程池实现?

最佳答案

阅读这篇文章,要点是写得不好的线程池可能会遇到这个问题。事实上,任何创建线程并且不/不能处理来自该线程的未捕获异常的应用程序。

我希望任何信誉良好的线程池来源都能以某种方式处理这种情况。通过信誉,我会包括 Oracle 来源的解决方案。我怀疑如果有人手工编写线程池代码并且他们缺乏经验,那么他们会编写一个不太健壮的解决方案。

关于java - 线程抛出 RuntimeException - 对线程池的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15429227/

相关文章:

java - 在 Guice 中绑定(bind) Set<String>

java - Eclipse:类似于 emacs ace-jump-mode 的插件?

java - JSON 解析抛出错误

c# - 使用 ThreadPool 进行垃圾收集

java - Websphere ScheduledExecutorService 线程

c# - 紧密循环中的线程池回调 - 100% CPU

java - 多线程环境下如何避免同步?

超过线程池 9 和排队任务 128 时,android 应用程序崩溃

c++ - 通知线程退出

java - 将 Jar 文件与 -classpath JAVA 组合