Runnable#run()中的Thread.currentThread()。interrupt()与this.interrupt()

时间:2018-10-03 09:44:06

标签: java multithreading

我需要弄清楚为什么我在Internet上找到的每个如何从interrupt()方法中捕获Runnable#run()的示例都看起来像这样:

while (Thread.currentThread().isInterrupted()) {
    //foo();
    try {
        Thread.sleep(1000);
    } catch(InterruptingException e) {
        Thread.currentThread().interrupt();
    }
    //foo();
}

我现在已经足够理解线程了(我是这样认为的),而且我不明白为什么如果我们使用run方法并不意味着我们可以将Thread.currentThread()替换为{{1 }}?

3 个答案:

答案 0 :(得分:3)

this内的

Runnable#run()是指Runnable对象,而不是封闭的Thread对象。在这种情况下,Thread.currentThread() != this

但是,如果创建如下所示的线程对象,则建议不要这样做:

Thread thread = new Thread() {
  @Override
  public void run() {
    System.out.println(Thread.currentThread() == this);
  }
};

然后Thread.currentThread() == this

答案 1 :(得分:3)

如果我们在run方法中,这并不意味着Thread.currentThread()==这个吗?

不。在run的{​​{1}}方法中,Runnable不等于this,它表示当前的current thread实例。

Runnable只是一个普通对象,可用于构造新线程。当您使用Runnable来构造Runnable时:

Thread

线程和可运行对象仍然是不同的对象。


这个例子表明它们是不同的东西:

Runnable runnable = ...
Thread thread = new Thread(runnable);

值得注意的另一件事是public static void main (String[] args) throws Throwable { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("inner runnable: " + this); // inner runnable: com.Test$1@34ce8af7 } }; Thread thread = new Thread(runnable); System.out.println("thread: " + thread); // thread: Thread[Thread-0,5,main] System.out.println("runnable: " + runnable); // runnable: com.Test$1@34ce8af7 thread.start(); thread.join(); } 也实现了java.lang.Thread接口,因此如果直接创建Runnable并覆盖Thread方法,则run关键字和this都将引用当前线程实例。

Thread.currentThread

此外,无论是否可以使用Thread thread = new Thread() { @Override public void run() { // this == Thread.currentThread() } }; 方法,例如,可以使用run方法,您都可以使用任何方法引用当前线程:

main

答案 2 :(得分:1)

如果this是线程,则只能用Thread.currentThread()替换this。这将需要扩展Thread,这很少是一个好主意。

您永远不需要像这样例外地使用Thread.currentThread()作为例外都会破坏循环。

try {
    while (true){
        try {
            //foo();
            Thread.sleep(1000);
        } finally {
            //foo();
        }
    }
} catch (InterruptingException e){
     // if the thread needs to continue after an interrupt.
     Thread.currentThread().interrupt();
}

我倾向于假定被中断的线程应尽快停止,在这种情况下,理想的情况是中断后线程不应该进行任何工作。