`Thread.currentThread()`在构造和运行时不是常量?

时间:2015-02-28 02:23:55

标签: java multithreading

在我的调试器上花了太多时间之后,我偶然发现了一些我还不清楚的有趣内容。我希望有更多Java经验的人解释并确认这一点:

我不是每次都使用Thread.currentThread().isInterrupted(),而是将内容缩短为thisThread.isInterrupted()。我在Runnable实现中将thisThread声明为private Thread thisThread = Thread.currentThread()。我很少知道在运行时,thisThreadThread.currentThread()指的是两个不同的东西。第一个"读取" Thread[main,5,main],第二个"读取" Thread[Thread-1,5,main]

好像Thread.currentThread()指的是在构造期间构造Runnable实现(main)的线程,并且一旦线程启动它就引用独立的,完全构造的线程。

这是对内部情况的正确解释吗?

我想了解课堂上Thread.currentThread()的原因。标头与Thread.currentThread()中的run()不同。

提前致谢了。

public class Temp implements Runnable {

    private Thread thisThread = Thread.currentThread();

    public void run() {

        while ( !thisThread.isInterrupted() ) {

            //[...]

        }

    }

}

2 个答案:

答案 0 :(得分:2)

在构造Runnable期间(到调用构造函数的线程)设置了thisThread

run期间的当前线程将是执行该方法的任何线程。

通常,这是两个不同的主题。

例如:

executorService.submit(new Temp());

这里,调用构造函数的线程将变为thisThread,但ExecutorService将调用run方法,该方法可能使用后台线程池。

答案 1 :(得分:1)

实例化Temp时,从主线程调用构造函数。因此,该值将成为主线程。由于您将其保留在thisThread中,因此它将始终显示主线程。但是如果你将thisThread更改为一个函数,无论何时调用它,它都会返回你实际所在的线程。