Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用并使用.interrupt()方法?_Java_Multithreading_Interrupt_Interrupt Handling - Fatal编程技术网

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

Java 调用并使用.interrupt()方法?,java,multithreading,interrupt,interrupt-handling,Java,Multithreading,Interrupt,Interrupt Handling,如何准确调用.interrupt()方法?当我有Thread.sleep(1000)时,何时何地调用.interrupt()方法?之后呢?我想做的是中途停止Thread.sleep(1000) 编辑:: 我把中间的一根线停下来有困难。这是我代码的一部分,在StoplightThread类中,我在第一条if语句中遇到了问题。它应该做的是等待至少10秒,然后允许用户按下按钮,以便他们可以更改指示灯,如果按下按钮,则应停止正在运行的线程,在这种情况下thread.sleep(40000)。当我按下按钮

如何准确调用
.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()可能是一种代码气味

编辑(操作编辑后):


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

您需要一个要中断的线程的引用,以便可以从不同的线程调用该线程上的中断()。

试试这个例子

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)

不完全是中途。所以我必须创建一个新线程来停止它?您希望它在一段时间后停止,还是在事件发生时停止?单个线程不能同时执行两件事情。如果你决定让它睡觉,它就会睡觉。直到超时时间过去。如果你不想睡觉,那么;ong,减少超时时间。可能是因为发生了什么事情——用户单击按钮或返回异步调用,或者。。。不管是什么东西,如果你设置得当,它应该来自不同的线程。在这个线程中,你会打断你的睡眠线程。也许您可以提供更多关于您正在做什么的详细信息。@FJam:如果一个事件被接收并处理,它将由另一个线程处理。线程不能同时休眠和处理事件。因此,从事件处理线程中断休眠线程。。。为什么
Thread.sleep(2000)开始?它是t.start()之后被调用的。t.start()在匿名类定义文件的下面被调用,它的run()方法是t.start()的结果,这导致调用Thread.sleep(2000)。当我们创建一个新线程时,它只是一个对象,还不能工作。当我们调用t.start()时,JVM会在并行线程中调用其方法run()