Multithreading 线程内的控制台日志记录不准确

Multithreading 线程内的控制台日志记录不准确,multithreading,logging,log4j,logback,Multithreading,Logging,Log4j,Logback,我正在使用logback实现,并创建了一个AsyncAppender,以便在线程内使用日志记录 线程类似于监视器:它使用从其他线程添加的对象的BlockingQueue,当队列不是空的,并且没有阻塞信号时,它记录队列的内容。同时,队列由几个线程填充 当线程从协调器获得停止信号时,它们会中断,因此不会在队列中添加更多内容 一旦出现阻塞信号(生产者线程已经中断),监视器队列就会中断,BlockingQueue为空 监视器线程的日志记录有两个问题: 生产者中断后,队列变为空,因此监视器线程也会立即中断

我正在使用logback实现,并创建了一个
AsyncAppender
,以便在线程内使用日志记录

线程类似于监视器:它使用从其他线程添加的对象的
BlockingQueue
,当队列不是空的,并且没有阻塞信号时,它记录队列的内容。同时,队列由几个线程填充

当线程从协调器获得停止信号时,它们会中断,因此不会在队列中添加更多内容

一旦出现阻塞信号(生产者线程已经中断),监视器队列就会中断,
BlockingQueue
为空

监视器线程的日志记录有两个问题:

  • 生产者中断后,队列变为空,因此监视器线程也会立即中断,而不显示队列的所有内容,即使它从队列中删除了所有内容

  • 显示的消息(在控制台appender和文件appender中)的顺序与插入队列的顺序不同

  • 我尝试了3种不同的方法:在线程内创建一个静态记录器,创建一个非静态记录器,并从创建监控线程的类中提供一个加载程序

    如果我在监视器线程中的一个while(true){}循环中执行所有操作,那么所有操作都会显示出来,但顺序不正确,而且我必须找出如何中断线程

    我还检查了
    MDC
    的情况,但我的问题有所不同:我必须在生产商生产时消费他们的产品,并且在他们生产完成后再消费,以防队列中还有东西

    我还检查了线程中的
    LoggerContext
    ,它的启动为false。这不应该是真的吗

    任何关于如何在中断线程之前显示所有内容并以正确顺序显示的想法都是有价值的

    谢谢