gpt4 book ai didi

用于基于时钟的仿真的 Java 多线程

转载 作者:太空宇宙 更新时间:2023-11-04 10:16:08 27 4
gpt4 key购买 nike

我想做的是使用线程来模拟基于时钟的硬件系统。在下面你可以看到我已经尝试过但没有效果的内容:

while (true)
{
Thread.sleep(0L, 1L);
synchronized (thread)
{
thread.notifyAll();
}
}

在等待时钟的线程中执行以下操作:

// 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在等待下一个tick之前运行。并且 Thread.sleep(long, long) 方法太慢,或者调用 Thread 的 hibernate 时间太长,即使是一纳秒也会导致系统卡顿。

我已经尝试过类似于下面显示的方法来解决 Thread.sleep(long, long) 方法,但这有时会导致时钟随机滴答,而没有任何 Thread 对此使用react:

while (cpu.getThread().getState() != Thread.State.WAITING && ppu.getThread().getState() != Thread.State.WAITING);

回到最初的问题,有什么办法可以以任何方式改进上面显示的代码吗?我可以在不使用任何 Thread 的情况下解决该问题吗?

最佳答案

这是一个单生产者多消费者问题。我们需要一种机制来保存所有线程的执行状态。因此,如果要使用对象 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

关于用于基于时钟的仿真的 Java 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51715107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com