我想要做的是使用线程来模拟一个基于时钟的硬件系统。在下面,你可以看到我已经尝试过的东西都没有用:
while (true)
{
Thread.sleep(0L, 1L);
synchronized (thread)
{
thread.notifyAll();
}
}
并在等待时钟的Thread
中执行以下操作:
// Do something before waiting.
System.out.println("Taking a nap!");
// And then wait for the clock.
synchronized (thread)
{
tick.wait();
}
我遇到的问题是,当我使用Thread.sleep(long, long)
方法时,我必须确保在等待下一个滴答之前,任何通知的Thread
都运行了。而且Thread.sleep(long, long)
方法太慢,或者调用Thread
的休眠时间过长,即使是一纳秒的时间也会导致系统卡顿。
我已经尝试了类似下面所示的方法来绕过Thread.sleep(long, long)
方法,但这有时会导致时钟随机滴答,而没有任何Thread
对此做出反应:
while (cpu.getThread().getState() != Thread.State.WAITING && ppu.getThread().getState() != Thread.State.WAITING);
回到最初的问题,有没有办法以任何方式改进上面显示的代码?我可以在不使用任何Thread
的情况下解决这个问题吗?
发布于 2018-08-07 06:24:44
这是一个一个生产者多消费者的问题。我们需要一种机制来保持所有线程的执行状态。因此,如果要使用wait/notifyAll对象:
生产者线程:
// map to contain all the consumer threads, true to indicate it's waiting
Map<Thread, Boolean> map = new HashMap<Thread, Boolean>();
while (true)
{
synchronized (tick)
{
if (allValuesInMapAreTrue(map)) {
for (Thread thread : map.keySet()) {
map.put(thread, false);
}
tick.notifyAll();
}
}
}
消费者线程:
@Override
public void run()
{
while (true)
{
doSomething();
waitForTick();
}
}
public void waitForTick()
{
synchronized (tick)
{
try {
Thread curr = Thread.currentThread();
map.put(curr, true);
tick.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
更好的是。在Java中检出条件:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html
https://stackoverflow.com/questions/51715107
复制相似问题