当前位置: 首页 > 知识库问答 >
问题:

ExcectorService何时在执行过程中失败?

梁华清
2023-03-14

根据Executors中有关newFixedThreadPool的文档,我发现

如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,则将有一个新的线程代替它。

当我运行代码时,我检测到容量为5的固定大小的线程池随着时间的推移继续生成线程,比如pool-1-thread-3212,假设为pool-1-thread-5或更少

所以我想知道ExecutorService什么时候决定它的一个线程失败并启动新的线程。

有人能告诉我为什么会这样吗?

共有1个答案

程天佑
2023-03-14

如果您没有正确实现异常处理,线程将会死亡,这取决于您将任务提交给ExeuctorService的方式。

由于您使用的是fixedthreadpool,因此必须维护固定数量的线程,以防线程死亡。

如果使用execute而不是submit,则thread将在未处理的异常情况下死亡。

import java.util.*;

public class ThreadDeath{
    public ThreadDeath()
    {
        System.out.println("creating service");
        ExecutorService service = Executors.newFixedThreadPool(2);
        for ( int i=0; i < 5; i++){
            service.execute(new Runnable(){
                     public void run(){
                        int a=4, b = 0;
                        System.out.println("Thread Name before divide by zero:"+Thread.currentThread().getName());
                        System.out.println("a and b="+a+":"+b);
                        System.out.println("a/b:"+(a/b));

                     }
                });
        }
        service.shutdown();
    }
    public static void main(String args[]){
        ThreadDeath test = new ThreadDeath();
    }
}
creating service
Thread Name before divide by zero:pool-1-thread-1
Thread Name before divide by zero:pool-1-thread-2
a and b=4:0
a and b=4:0
Exception in thread "pool-1-thread-1" Thread Name before divide by zero:pool-1-thread-3Exception in thread "pool-1-thread-2"
a and b=4:0
Thread Name before divide by zero:pool-1-thread-4
Exception in thread "pool-1-thread-3" a and b=4:0java.lang.ArithmeticException: / by zero

Thread Name before divide by zero:pool-1-thread-5

现在,在提交runnable任务时,只需将execute替换为submit即可。异常将被吞掉,输出如下所示:(您只能看到两个线程,因为FixedThreadPool大小为2)

creating service
Thread Name before divide by zero:pool-1-thread-1
a and b=4:0
Thread Name before divide by zero:pool-1-thread-2
a and b=4:0
Thread Name before divide by zero:pool-1-thread-1
a and b=4:0
Thread Name before divide by zero:pool-1-thread-2
Thread Name before divide by zero:pool-1-thread-1
a and b=4:0
a and b=4:0

有关线程创建的更多详细信息,请参阅以下grepcode链接:

private boolean addWorker(Runnable firstTask, boolean core) 
 类似资料:
  • 已安装Java版本8更新271。 从这个链接下载了swagger-codemen-cli版本2.4.17 当我运行命令生成时,我得到以下问题 我必须使用这个JSON,但我也测试了这个样本JSON 对于2.4.7 rc1,我得到以下错误: 试着一步一步地找到答案。没找到。 任何指针都是有用的 尚卡尔

  • 当我想声明这个程序时,它没有声明这个代码没有报告任何报告 我不知道那是问题 我想在solr索引中使用此过程,但此过程不执行 当我将分隔符更改为@@时,会出现此错误 错误1064 (42000):你有一个错误在你的SQL语法;检查手册,对应于你的MySQL服务器版本的正确语法使用附近的'默认NULL;声明stateORds varchar(255)默认NULL;在第4行mysql声明叶猫

  • 我已经通过libav-tools对安装了ffmpeg的应用程序进行了dockerize。该应用程序启动时没有问题,但是当Fluent-ffmpeg npm模块试图执行ffmpeg命令时出现了问题,但没有找到。当我想检查ffmpeg的版本和图像中设置的linux发行版时,我使用了命令,但它给出了以下错误: 然后我意识到,我尝试在图像或容器中运行的所有命令都会出现同样的错误。 这是我的Dockerfi

  • 我有一个问题使用Maven exec插件执行Java工具。我试图将输出目录指定为javah,其中头文件要放置,但我得到了错误: [信息]---exec maven插件:1.5.0:exec(创建jni头)@jni测试osgi---错误:未知选项:-d/home/kerry[Error]命令执行失败。 这是POM的相关章节: 如果我执行从命令行执行,则没有问题。 我是做错了什么,还是Maven ex

  • 问题内容: 简而言之:我正在尝试在Entity Framework中运行Oracle存储过程(我知道这听起来很奇怪,但是在一般应用程序中使用Entity Framework,但是由于修改密钥的限制,EF无法处理此特定命令。值)。 过程具有一些参数(仅IN),并更新表中的值。我通过运行测试了它: 它工作正常。 我的参数定义如下: 我的查询是: 我正在尝试从C#代码执行它。即通过运行: 我收到错误OR