Java 如果失败,如何重新启动线程
我有一个代码,我使用阻塞队列使pub/sub异步,如果我的线程失败,它将不会消耗任何东西,我如何解决它Java 如果失败,如何重新启动线程,java,spring,multithreading,Java,Spring,Multithreading,我有一个代码,我使用阻塞队列使pub/sub异步,如果我的线程失败,它将不会消耗任何东西,我如何解决它 @服务 公共抽象类AsyncPublisher扩展了GeneralPublisher{ private final BlockingQueue BlockingQueue=新建LinkedBlockingQueue(); Logger Logger=LoggerFactory.getLogger(getClass()); 公共发布服务器(){ 新线程(()->{ while(true){ 试一
@服务
公共抽象类AsyncPublisher扩展了GeneralPublisher{
private final BlockingQueue BlockingQueue=新建LinkedBlockingQueue();
Logger Logger=LoggerFactory.getLogger(getClass());
公共发布服务器(){
新线程(()->{
while(true){
试一试{
T=blockingQueue.take();
超级出版(t);
}接住(可抛接器){
error(“线程中的AsyncPublisher错误”,er);
}
}
}).start();
}
公开无效发布(T){
试一试{
阻塞队列。put(t);
}捕获(异常er){
LOGGER.error(“发布过程中在AsyncPublisher中出错”,er);
}
}
}
无论注释如何,要“修复”问题,您需要做的是更改类的结构。
而不是在构造函数中初始化线程(从而自动启动)。您可以创建一些方法,如start
、stop
、isRunning
,并使用这些方法处理线程
保留对线程的引用以“监视”它。同样从您的@服务中
我相信您使用的是Spring。Spring有一个生命周期()和smartlifecycle(),您可以使用它在上下文中插入类,让Spring监视它是否正在运行并重新启动它
这种方法很常见(除了Spring和其他使用它的项目外,project Reactor返回一个名为
disposable
的项,该项带有一个函数isdisclosed
,以跟踪您创建的流。流
是这里特定于反应堆的参考。)改用线程池。无论您的问题是什么,都不要捕获可丢弃的。“线程失败”是什么意思。这种循环不允许线程失败。你能举一个失败的例子吗?