如何使用java Thread.currentThread()。interrupt()

时间:2018-05-07 05:45:43

标签: java multithreading interrupt

如果我覆盖我的运行功能,

Thread t = new Thread(){
                public void run(){
                    try {
                        if(Thread.currentThread().isInterrupted()) {
                            doSomePrcocess() // is the isInerrupted() flag seeting to true?
                            return; //Terminates the current Thread
                        }
                        //otherwise 
                        runScript();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            t.start();

然后如果我从代码中的任何一点调用Thread.currentThread().interrupt(),那么线程是否应该停止并在那时开始运行doSomeProcess()?如果是,那么中断的标志如何设置为真?如果不是,该怎么做?

3 个答案:

答案 0 :(得分:2)

  • 如果线程处于休眠或等待状态,在线程上调用interrupt()方法,则会中断睡眠或等待状态
  

抛出InterruptedException

  • 如果线程未处于休眠或等待状态,请调用 interrupt()方法执行正常行为,不会中断线程,但会将中断标志设置为true。

Thread类具有处理线程中断的条件

public void interrupt()
public static boolean interrupted()
public boolean isInterrupted()

如果你打算只执行一次doSomePrcocess,那么你必须检查并清除连续调用的Thread中断状态。

public static boolean interrupted()

使用以下内容只会检查状态而不进行修改。

public boolean isInterrupted()

答案 1 :(得分:1)

我在下面的代码中有一个带有注释的运行示例。尝试运行几次以查看它是否可以阐明您的概念。

通常,您将从另一个线程中中断一个线程,是的,doSomeProcess将在循环的下一个周期中调用,该周期可能是该线程被中断后1毫秒,也可能是您的方法中实现的逻辑之后1个小时。 >

public class InterruptTest {

    public static void main(String[] args) throws InterruptedException {

        Thread t = new Thread() {
            public void run() {
                while (true) {
                    try {

                        if (Thread.currentThread().isInterrupted()) {
                            doSomePrcocess(); // is the isInerrupted() flag seeting to true? - Yes
                            return; // Terminates the current Thread - yes
                        }
                        // otherwise
                        runScript();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }

            private void runScript() {
                System.out.println("runScript interrupted status:" + this.isInterrupted());
                sleepy(100);


            }

            private void doSomePrcocess() {
                System.out.println("doSomePrcocess interrupted status:" + this.isInterrupted());
                sleepy(500);
            }

            private void sleepy(int millis) {
                try {
                    Thread.sleep(millis);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Thread.currentThread().interrupt(); // try commenting this out to see what happens.
                }
            }
        };
        t.start(); 

        Thread.sleep(1000);

        t.interrupt(); // generally you would call interrupt on another thread.

    }

}

答案 2 :(得分:0)

不,它不会那样工作。 isInterrupted方法检查标志是否已设置,它不会声明处理程序。无法定义在线程中断时自动调用的中央处理程序。您可以做的是捕获InterruptedException并调用处理程序,并定期检查中断标志以查看是否该停止。