1

我希望有人会帮助我。我一直在尝试用 java Threads 做一个红绿灯。有两个圈。每个圆圈都是一盏灯(线)。我希望每盏灯工作 x 毫秒,然后关闭并让另一盏灯工作(一次又一次..)

public void run()
{
    while (true)
    {           
        repaint();
        if (working)
        {
            System.out.println(name + " is WORKING ");
            try
            {
                Thread.sleep(LAMP_WORKING_TIME);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }

            System.out.println(name + " has done working");

            synchronized (lock)
            {
                this.working = false;
                lock.notifyAll();
            }
        }
        else
        {
            try
            {
                System.out.println(name + " is waiting..");

                synchronized (lock)
                {
                    lock.wait();
                    working = true;
                }

                System.out.println(name + " is WAKING UP AFTER WAIT");
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
}

当 lock 被声明为类的属性时:

private final Object lock = new Object();

我相信我的问题是通过等待/通知方法发生的。请帮我解决这个问题!

4

2 回答 2

2

当您的代码读取时,它将等待LAMP_WORKING_TIMEms,将工作设置为 false,并在下一个循环中立即将其设置回 true。working只有当它为真时你才在睡觉,所以你的“开启”周期是LAMP_WORKING_TIME,而“关闭”周期与释放和重新获得锁所需的时间一样长。大概不到1ms。

于 2012-02-14T17:28:01.133 回答
1

您可能希望lock在实例之间共享。因此,要么制作它,static要么将它作为参数传递给您的Runnables/ Threads,而不是为每个实例创建一个新实例,即使它是final.

于 2012-02-14T17:30:24.667 回答