调用并使用.interrupt()方法



如何调用.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();
        }           
    }
}

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

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

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

总之,sleep()可以是代码气味。

EDIT (after OP EDIT):

在你的actionPerformed()方法中的GUI线程中调用interrupt()对stopplightthread。

试试这个例子

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)

您需要一个您想要中断的线程的引用,以便您可以从另一个线程调用interrupt()

最新更新