我究竟如何调用.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();
}
}
}
答案 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()
。