调用并使用.interrupt()方法?

时间:2013-05-13 21:53:15

标签: java multithreading interrupt interrupt-handling

我究竟如何调用.interrupt()方法?当我Thread.sleep(1000)时,我何时何地调用.interrupt()方法?是吗?我想做的是中途停止Thread.sleep(1000)

EDIT ::

我在中间阻止线程时遇到问题。这是我的代码的一部分,在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();
        }           
    }
}

3 个答案:

答案 0 :(得分:1)

如果你要打电话给interrupt(),你可以从与睡眠()不同的线程中调用它。

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

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

所有这一切,sleep()可以是代码气味。

编辑(OP编辑后):

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

答案 1 :(得分: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)

答案 2 :(得分:0)

您需要引用要中断的线程,以便可以从其他线程调用interrupt()