根据Executors中有关newFixedThreadPool的文档,我发现
如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,则将有一个新的线程代替它。
当我运行代码时,我检测到容量为5的固定大小的线程池随着时间的推移继续生成线程,比如pool-1-thread-3212
,假设为pool-1-thread-5或更少
所以我想知道ExecutorService什么时候决定它的一个线程失败并启动新的线程。
有人能告诉我为什么会这样吗?
如果您没有正确实现异常处理,线程将会死亡,这取决于您将任务提交给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