首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的线程在捕获到异常时不能创建一个新的线程?

为什么我的线程在捕获到异常时不能创建一个新的线程?
EN

Stack Overflow用户
提问于 2020-07-13 00:52:40
回答 2查看 81关注 0票数 0

所以我有一个线程像这样运行:

代码语言:javascript
复制
Runnable runnable = new Runnable() {
                        @Override
                        public void run() {
                            System.out.println("redo groupMonitor ... ");
                            if (redogmSafer < 1) {
                                groupMonitor.run(remoteHost, port);
                            } else {
                            }
                            redogmSafer = 100;
                        }
                    };
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(runnable, 0, delayStart, TimeUnit.MILLISECONDS);

if (redogmSafer < 1) {
} else {
    service.shutdown();
    service.shutdownNow();
    redogmSafer = 0;
}

我想在Thread由于异常或其他原因退出后(每4-5个小时都会发生)再次执行run()

我尝试过shutdown()shutdownNow(),但也没有用。这就像Java在启动、启动和关闭后不想重做线程一样……

EN

回答 2

Stack Overflow用户

发布于 2020-07-13 01:05:13

您可以像这样创建一个新的Thread:

代码语言:javascript
复制
Thread newThread = new Thread(runnable);

newThread.start();

或者使用ExecutorService:

代码语言:javascript
复制
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(runnable);

但是您已经在使用一个ScheduledExecutorService,它应该可以完成这项工作。

票数 0
EN

Stack Overflow用户

发布于 2020-07-13 01:21:36

使用try- Callable包装您的Runnable /Callable代码

ScheduledExecutorService在接收到Throwable ( ExceptionError)时停止进一步的调度。此停止是静默的,不会报告错误,也不会出现消息或日志记录。

因此,您应该着眼于问题的预防,而不是修复。预防方法是使用Runnable - Callable包装您的try/catch代码。

只要调用堆栈中没有Throwable到达调度的executor服务,调度就会继续。

代码语言:javascript
复制
Runnable runnable = new Runnable() {
                        @Override
                        public void run() {
                            try{
                                System.out.println("redo groupMonitor ... ");
                                if (redogmSafer < 1) {
                                    groupMonitor.run(remoteHost, port);
                                } else { 
                                    …
                                }
                                redogmSafer = 100;
                            } catch ( Exception e ) { … }
                        }
                    };

是捕获ThrowableException还是一些更具体的异常,由您和您的团队根据您的情况来决定。

这个话题已经在Stack Overflow上被多次讨论过了。搜索以了解更多信息。具体来说,请参阅。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62863898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档