所以我有一个线程像这样运行:
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在启动、启动和关闭后不想重做线程一样……
发布于 2020-07-13 01:05:13
您可以像这样创建一个新的Thread:
Thread newThread = new Thread(runnable);
newThread.start();或者使用ExecutorService:
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(runnable);但是您已经在使用一个ScheduledExecutorService,它应该可以完成这项工作。
发布于 2020-07-13 01:21:36
使用try- Callable包装您的Runnable /Callable代码
ScheduledExecutorService在接收到Throwable ( Exception或Error)时停止进一步的调度。此停止是静默的,不会报告错误,也不会出现消息或日志记录。
因此,您应该着眼于问题的预防,而不是修复。预防方法是使用Runnable - Callable包装您的try/catch代码。
只要调用堆栈中没有Throwable到达调度的executor服务,调度就会继续。
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 ) { … }
}
};是捕获Throwable、Exception还是一些更具体的异常,由您和您的团队根据您的情况来决定。
这个话题已经在Stack Overflow上被多次讨论过了。搜索以了解更多信息。具体来说,请参阅。
https://stackoverflow.com/questions/62863898
复制相似问题