首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用并使用.interrupt()方法?

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

Stack Overflow用户
提问于 2013-05-14 05:53:15
回答 3查看 323关注 0票数 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是红色的。

代码语言:javascript
复制
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();
        }           
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-14 05:55:12

如果要调用interrupt(),那么应该从不同于sleep()的线程调用它。

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

代码语言:javascript
复制
   Thread.sleep( 500 );
   ... 
   Thread.sleep( 500 );

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

编辑(在OP编辑之后):

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

票数 1
EN

Stack Overflow用户

发布于 2013-05-14 06:03:15

试一下这个例子

代码语言:javascript
复制
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();
    }
}

它打印出来

代码语言:javascript
复制
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at test.Test1$1.run(Test1.java:9)
票数 1
EN

Stack Overflow用户

发布于 2013-05-14 05:55:53

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16531790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档