基于时钟仿真的Java多线程

基于时钟仿真的Java多线程,java,multithreading,Java,Multithreading,我想做的是使用线程来模拟基于时钟的硬件系统。下面你可以看到我已经尝试过但没有效果的东西: while (true) { Thread.sleep(0L, 1L); synchronized (thread) { thread.notifyAll(); } } 在等待时钟的线程中执行以下操作: // Do something before waiting. System.out.println("Taking a nap!"); // And th

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

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
都在等待下一个滴答声之前运行。而且
Thread.sleep(long,long)
方法太慢,或者调用
Thread
的睡眠时间太长,甚至一纳秒都会导致系统结巴

我已经尝试过类似下面所示的方法来绕过
线程。sleep(long,long)
方法,但这有时会导致时钟随机滴答作响,而没有任何
线程
对此作出反应:

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

回到最初的问题,是否有任何方法可以以任何方式改进上面显示的代码?我是否可以在不使用任何
线程的情况下解决此问题?

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

你能分享一个完整且可验证的例子,以便我们重现你的问题吗?我不是这方面的专家,但我不确定睡眠1纳秒是否真的非常准确。它可能会挂起线程,然后立即唤醒它,但我打赌这需要一纳秒以上的时间。您可能希望编写一个打印当前时间(非常准确)的测试,然后执行您的小睡眠线程,例如10000次,然后打印时间。看看到底花了多少时间。@JosephLarson是的,我知道,但睡眠是有效的,因为调度程序在那一刻调用了其他线程,唯一的问题是它会变慢,但当我做一些更快的事情时,我经常会做一些滴答声,不会唤醒等待的线程。这就是我正在做的,问题是有时毕竟,我猜生产者ceep正在运行,因此它将返回以检查是否所有人都在等待,并且因为没有其他人在运行,所以他们都还在等待,生产者通知againI see,调度程序可能会在生产者离开后立即让生产者重新进入同步块。编辑代码以使用map而不是set跟踪消费者状态,然后