首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于基于时钟的仿真的Java多线程

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

Stack Overflow用户
提问于 2018-08-07 04:22:14
回答 1查看 240关注 0票数 2

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

代码语言:javascript
复制
while (true)
{
    Thread.sleep(0L, 1L);
    synchronized (thread)
    {
        thread.notifyAll();
    }
}

并在等待时钟的Thread中执行以下操作:

代码语言:javascript
复制
// 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对此做出反应:

代码语言:javascript
复制
while (cpu.getThread().getState() != Thread.State.WAITING && ppu.getThread().getState() != Thread.State.WAITING);

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

EN

回答 1

Stack Overflow用户

发布于 2018-08-07 06:24:44

这是一个一个生产者多消费者的问题。我们需要一种机制来保持所有线程的执行状态。因此,如果要使用wait/notifyAll对象:

生产者线程:

代码语言:javascript
复制
// 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();
        }
    }
}

消费者线程:

代码语言:javascript
复制
@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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51715107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档