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

标签 java multithreading interrupt interrupt-handling

我到底如何调用.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() 可能是一种代码味道。

编辑(OP编辑后):

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

关于java - 调用并使用 .interrupt() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16531790/

相关文章:

java - 使用 Spring-Data Repositories 和 JPQL 查询的 JPA 鉴别器

java - 从 GCP 存储桶读取文件的 NoSuchMethod

java - 中断()不起作用

linux - 从内核中断读取设备

c - STM32多 channel 输入捕获在所有 channel 上过度捕获(中断未执行)

java - 文件未在 Java 中访问

java - Java 中的异步 File.copy

c++ - OpenMP C++ 中的线程

java - Java的线程状态如何映射到linux?如果Java的状态是runnable,Linux上是什么

c# - 控制 Windows 窗体中多个线程之间的同步