gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:27:04 24 4
gpt4 key购买 nike

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

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

我现在对线程的理解已经够多了(我是这么认为的),我不明白为什么如果我们在 run 方法中,这不意味着我们可以替换 Thread.currentThread () 通过 this?

最佳答案

如果我们在 run 方法内部,这是否意味着 Thread.currentThread() == this?

没有。在Runnablerun方法中,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接口(interface),所以如果你直接创建一个Thread并覆盖run 方法、this 关键字和 Thread.currentThread 都将引用当前线程实例。

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

你也可以在任何方法中引用当前线程,无论你是否可以在 run 方法中,例如,在 main 方法中:

public static void main (String[] args) throws Throwable {
Thread.currentThread().interrupt();
}

关于java - Thread.currentThread().interrupt() 与 Runnable#run() 中的 this.interrupt(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52624179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com