我在多线程环境中遇到变量问题。
我有3个组件/线程:Controller,Handler,ExternalAgent。
Controller将原始数据交给Handler。处理程序旋转新的ExternalAgent线程以进行进一步处理。一旦完成了它的事情,ExternalAgent就会回到Handler,并将消息添加到链接列表以供Handler进一步处理。
问题是,ExternalAgent添加的消息对Handler内部的某些方法不可见。这是Handler代码:
public class InboundHandler implements InboundController.Handler {
private Thread receiver;
private volatile LinkedList<Message> bufferedMsgs = new LinkedList<Message>();
private volatile boolean isAlive = true;
private final static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
public InboundHandler() {
receiver = new Thread(this,"receiver");
receiver.start();
}
@Override
public void run() {
while (isAlive) {
processBuffer();
}
}
@Override
public void process(String msg) {
Message packet = (Message) new Parser<Message>(Message.class,msg).getObject();
new ExternalAgent(this,packet).start();
}
public void processBuffer() {
logger.info("Processing buffersize .." + bufferedMsgs.size());
synchronized (bufferedMsgs) {
Iterator<Message> it = bufferedMsgs.iterator();
while (it.hasNext()) {
//PROCESSING
}
}
}
public void addMsgToBuffer(Message m) {
synchronized (bufferedMsgs) {
bufferedMsgs.addLast(m);
}
}
控制器通过process(msg)
界面与处理程序对话
ExternalAgent 通过addMsgToBuffer(msg)
界面与处理程序对话。
在方法processBuffer()
中,LinkedList bufferedMsgs总是显示为空,但如果我在方法addMsgToBuffer()
中打印它,它会给我预期的内容。我已经尝试了所有知识,以了解为什么会发生这种情况,但我无法弄明白。