【发布时间】:2019-09-23 10:40:58
【问题描述】:
我有一个代码,我使用阻塞队列使 pub/sub 异步,如果我的线程失败它不会消耗任何东西我该如何解决它。
@Service
public abstract class AsyncPublisher<T> extends GeneralPublisher<T> {
private final BlockingQueue<T> blockingQueue = new LinkedBlockingQueue<>();
Logger LOGGER = LoggerFactory.getLogger(getClass());
public AsyncPublisher() {
new Thread(() -> {
while (true) {
try {
T t = blockingQueue.take();
super.publish(t);
} catch (Throwable er) {
LOGGER.error("Error in AsyncPublisher in Thread", er);
}
}
}).start();
}
public void publish(T t) {
try {
blockingQueue.put(t);
} catch (Exception er) {
LOGGER.error("Error in AsyncPublisher during publishing", er);
}
}
}
【问题讨论】:
-
改用线程池。
-
永远不要抓到
Throwable,不管你的问题是什么。你是什么意思“线程失败”。这种循环不应该让你的线程失败。你能举一个失败的例子吗?
标签: java spring multithreading