Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果失败,如何重新启动线程_Java_Spring_Multithreading - Fatal编程技术网

Java 如果失败,如何重新启动线程

Java 如果失败,如何重新启动线程,java,spring,multithreading,Java,Spring,Multithreading,我有一个代码,我使用阻塞队列使pub/sub异步,如果我的线程失败,它将不会消耗任何东西,我如何解决它 @服务 公共抽象类AsyncPublisher扩展了GeneralPublisher{ private final BlockingQueue BlockingQueue=新建LinkedBlockingQueue(); Logger Logger=LoggerFactory.getLogger(getClass()); 公共发布服务器(){ 新线程(()->{ while(true){ 试一

我有一个代码,我使用阻塞队列使pub/sub异步,如果我的线程失败,它将不会消耗任何东西,我如何解决它

@服务
公共抽象类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
,以跟踪您创建的
流。
是这里特定于反应堆的参考。)

改用线程池。无论您的问题是什么,都不要捕获可丢弃的
。“线程失败”是什么意思。这种循环不允许线程失败。你能举一个失败的例子吗?