我需要弄清楚为什么我在Internet上找到的每个如何从interrupt()
方法中捕获Runnable#run()
的示例都看起来像这样:
while (Thread.currentThread().isInterrupted()) {
//foo();
try {
Thread.sleep(1000);
} catch(InterruptingException e) {
Thread.currentThread().interrupt();
}
//foo();
}
我现在已经足够理解线程了(我是这样认为的),而且我不明白为什么如果我们使用run
方法并不意味着我们可以将Thread.currentThread()
替换为{{1 }}?
答案 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();
}
我倾向于假定被中断的线程应尽快停止,在这种情况下,理想的情况是中断后线程不应该进行任何工作。