Java 线程处理

标签 java multithreading applet awt event-dispatch-thread

我正在尝试制作一个红绿灯,在单击按钮后执行某些任务。这个红绿灯应该做的是50秒后从绿色变成黄色,10秒后从黄色变成红色,60秒后从红色变成绿色(这部分我工作得很好),如果按钮在绿色时按下,它应该变成黄色,这应该只有在绿色时至少过去10秒后才起作用。我的问题是如何检查 10 秒是否已经过去?

public class Stoplight extends Applet
{
    Button cross;

    public void init(){
       cross = new Button("Cross");
       add(cross);

       StoplightCanvas stoplightCanvas = new StoplightCanvas(cross);
       add(stoplightCanvas);

       new StoplightThread(stoplightCanvas).start();
    }
}

class StoplightCanvas extends Canvas implements ActionListener
{  
    int Xpos;
    int Ypos;
    int diameter;
    Button cross;
    int x = 1;

    StoplightCanvas(Button cross)
    {
        this.cross = cross;
        cross.addActionListener(this);
        setSize(300, 600);
    }

    public void paint(Graphics g)
    {
        diameter = 70;
        Xpos = 70;
        Ypos = 50; 

        g.setColor(Color.BLUE);
        g.fillRect(70, 50, 74, 220); 

        g.setColor(Color.WHITE);

        if (x == 1) 
           g.setColor(Color.RED);
        drawCircles(g, Xpos, Ypos);

        g.setColor(Color.WHITE);
        if (x == 2) 
            g.setColor(Color.YELLOW);
        drawCircles(g, Xpos, Ypos + diameter);

        g.setColor(Color.WHITE);
        if (x == 3)
        g.setColor(Color.GREEN);
        drawCircles(g, Xpos, Ypos + diameter * 2);    
    }

    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == cross) {                   
        }  

        repaint();
    }

    void drawCircles(Graphics g, int x, int y)
    {   
        g.fillOval(x, y, diameter, diameter);     
    }

    public void toggleColor() {
        if (x == 1) 
            x = 3;
        else if (x == 2)
            x = 1;
        else if (x == 3) 
            x = 2;
    }
}

class StoplightThread extends Thread
{
    StoplightCanvas stoplightCanvas;

    StoplightThread(StoplightCanvas stoplightCanvas) {
        this.stoplightCanvas = stoplightCanvas;
    }

    public void run() 
    {
        while (true) {
           try {
               if (stoplightCanvas.x == 3){
                   Thread.sleep(50000);
               } else if (stoplightCanvas.x == 2) {
                   Thread.sleep(10000);    
               } else if (stoplightCanvas.x == 1) {
                   Thread.sleep(60000);
               }
           } catch (InterruptedException e){}

           stoplightCanvas.toggleColor();
           stoplightCanvas.repaint();
        }           
    }
}

最佳答案

您可以设置一个计时器,当他们按下按钮 10 秒时。当该时间到期时,然后通过回调将颜色更改为黄色。这比处理异常要好得多,因为它们应该是针对特殊情况的。

参见this thread关于如何设置稍后使用的计时器。

编辑

发帖者希望不使用计时器。一种方法是将按下按钮的时间存储在变量中,然后访问该变量并在 run 方法的 while 循环中与当前时间进行比较。

关于Java 线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16390907/

相关文章:

java - Guava缓存asMap方法

java - Java中有多个线程访问同一方法时的线程安全性

java - Spring boot 1.4.x 和自定义 CharsetProvider

java - JPanel 从窗口消失

c# - C# 静态构造函数线程安全吗?

java - 类级锁定 - 效率如何?

Java - MacAddressApplet 更新到 8u45 后不工作

java - 在 java 浏览器中部署 HTML 文件

java - 小程序是否使用浏览器进行 HTTP 请求?

java - java执行路径分析工具