1

在执行多线程程序期间,我对当前线程是什么感到困惑。

public class CurrentThread {

public static void main(String[] args) {
            // FROM HERE: will always be "main-thread" the current thread ?
    CurrentThread currentThread = new CurrentThread();
    currentThread.testCurrentThread();
            // TO HERE         
}

private void testCurrentThread() {
    // some other threads starts...
    AThread athread = new AThread();
    athread.start();
    // some other threads starts...
}

class AThread extends Thread {

    public AThread() {
        setName("thread-a");
    }

    public void run() {
        // FROM HERE: will always be thread-a the current thread during finish the run method ?
                    // some process
                    // TO HERE...
    }
}

}

假设在启动线程AThread之前和之后启动多个线程:

  1. 当您在 main 方法中时,无论何时调用 Thread.currentThread() 都会是“主线程”?
  2. 当您在 AThread 的 run 方法中时,无论何时调用 Thread.currentThread() 都会是“a-thread”?

提前致谢。

4

2 回答 2

5

currentThread:返回对当前正在执行的线程对象的引用。

因此,当您在 main 方法中时,这就是您的主线程,而当您在 AThread 的 run 方法中时,那就是您的 a-thread。

于 2013-05-22T17:03:41.243 回答
1

如果我正确理解您的问题,您不清楚“主线程”和“当前线程”的区别。首先,主线程是定义应用程序上下文的线程;当主线程结束时,应用程序也(应该)结束。

“当前线程”可以是相对的;你可以让任意数量的线程同时运行——这就是线程的意义——但是“当前线程”可能意味着“我们现在正在谈论的执行线程”,或者它可能意味着你获得引用的 Thread 对象通过调用静态方法,如前所述——这意味着“这个线程,我是其中一个步骤的执行路径”。如果您在主类或运行主类的线程中调用 currentThread() 方法,您将获得对主线程的引用——控制应用程序生命周期的线程(这被大大简化了)。如果您从作为扩展线程的对象的 run 方法的一部分或由其调用而正在运行的任何代码中调用 currentThread(),您将获得对该对象的该实例的引用。从本质上讲,这就是 Juned 上面所说的内容。

此外,我谦虚地提出,您可能正在混合语言;CurrentThread是 C# 中的类,但不是 Java 中的类。

于 2013-05-22T17:23:17.150 回答