运行我的程序,这是多线程的,似乎导致线程干扰,即使我使用关键字 synchronized 作为对我的部分有影响的方法问题在于。
我有一个静态嵌套类 站,其中包含以下方法:
public synchronized boolean addQueuer(String ID)
{
if (!buffer.isFull())
{
buffer.enqueue(ID);
return true;
}
return false;
}
private synchronized void removeQueuer()
{
buffer.dequeue();
}
缓冲区是一个包装的简单队列。
在两个不同的主题中,我称之为这些方法。在封装器中,main方法具有以下代码行:
while (true)
{
stations[0].addQueuer("M");
Thread.sleep(FREQ_TIMER);
}
哪里的电台是电台的数组,在我的测试中包含一个电台
在 Station 中,我有以下 run()函数用于实现Runnable(我通过创建此类的实例启动一个线程,然后调用这个线程的start():
public void run()
{
try
{
Thread.sleep(ESTIMATED_SERVICE_TIME);
while (!buffer.isEmpty())
{
removeQueuer();
}
if (isOpen)
run();
} catch (InterruptedException interruptException)
{
threadMessage("This station was interrupted.");
}
}
出了什么问题:
我调整了 CONSTANTS ,这样缓冲区应该比清空时更快填满。但是,当我运行我的程序时,缓冲区可能从7开始,在下一个循环中下一次运行时下降到6,然后它将永远保持在6。
首先,对同一对象的两个同步方法的调用不可能进行交错。当一个线程正在为对象执行同步方法时,所有其他线程调用同一对象的同步方法阻塞(暂停执行),直到第一个线程完成对象为止。 - Java Tutorials
为什么放置同步还不够?如果需要任何其他背景/信息,请发表评论,我会尽力。
修改:已添加the entire code。