0

我究竟如何调用该.interrupt()方法?当我Thread.sleep(1000)有时,我何时何地调用该.interrupt()方法?是在之后吗?我想做的是Thread.sleep(1000)中途停下来。

编辑::

我无法在中间停止线程。这是我的代码的一部分,在StoplightThread课堂上我的第一个 if 语句有问题。它应该做的是等待至少 10 秒,然后允许用户按下按钮,以便他们可以改变灯光,如果按下按钮,它应该在这种情况下停止正在运行的线程Thread.sleep(40000)。发生的情况是,当我按下按钮时,它会改变灯光但不会停止线程。如果我在还剩 20 秒时按下按钮,它将在黄灯的 10 秒上增加 20 秒,使其黄灯持续 30 秒。

编辑:如果你想知道,stoplightCanvas.x == 3是绿色的,stoplightCanvas.x == 2是黄色的,stoplightCanvas.x == 1是红色的。

class StoplightCanvas extends Canvas implements ActionListener
{  

    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == cross) {
            isPressed = true;
            if (x == 3 && canCross)
                x = 2;     
        }
        repaint();
    }

}


class StoplightThread extends Thread
{
    StoplightCanvas stoplightCanvas;

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

    public void run() 
    {
        if (stoplightCanvas.x == 3){
               Thread.sleep(10000);
               stoplightCanvas.canCross = true;
               Thread.sleep(40000);
               if(stoplightCanvas.isPressed)
                   StoplightThread.interrupt();
           } else if (stoplightCanvas.x == 2) {
               Thread.sleep(10000);    
           } else if (stoplightCanvas.x == 1) {
               Thread.sleep(60000);
           }
       } catch (InterruptedException e){}

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

3 回答 3

1

试试这个例子

public class Test1 {

    public static void main(String[] args) throws Exception {
        Thread t = new Thread() {
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        t.start();
        Thread.sleep(1000);
        t.interrupt();
    }
}

它打印

java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at test.Test1$1.run(Test1.java:9)
于 2013-05-13T22:03:14.520 回答
1

如果你要调用interrupt(),你会从与 sleep() 不同的线程调用它。

如果你想从同一个线程中途中断 sleep(),你可以这样做:

   Thread.sleep( 500 );
   ... 
   Thread.sleep( 500 );

尽管如此,sleep() 可能是一种代码味道。

编辑(在 OP 编辑​​之后):

从您的 actionPerformed() 方法中的 GUI 线程调用StoplightThread 上的interrupt() 。

于 2013-05-13T21:55:12.333 回答
0

您需要对要中断的线程的引用,以便您可以interrupt()从不同的线程调用它。

于 2013-05-13T21:55:52.567 回答