【问题标题】:Java current threadJava 当前线程
【发布时间】:2013-05-22 16:59:43
【问题描述】:

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

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”?

提前致谢。

【问题讨论】:

  • 简而言之:1) 是 2) AThread 实例的线程。
  • 谢谢 luiggi,如果线程在 run 方法或 main 方法中没有相互干扰,我会感到困惑。
  • 不,线程不会相互干扰。请注意,它们可以共享相同的数据(例如List<SomeObject> someObjectList)并并行处理。
  • 是的,线程可以共享相同的数据!

标签: java multithreading


【解决方案1】:

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

所以当你在你的 main 方法中时,那是你的主线程,当你在 AThread 的 run 方法中时,那是你的 a-thread。

【讨论】:

  • 它不会直接是a-thread。如果您有两个 AThread 实例并启动它们,它们将位于不同的线程中。
  • 另外请注意,如果 AThread 的多个实例正在运行,它们都将具有相同的名称(如果您必须调试它,那就不好了)
  • @LucaTettamanti 这是一个有效的观点,具有相同的名称不是一个好主意。但我相信提问者已经编写了这个原始代码来回答他的困惑。所以我们应该对这里的编码正确性宽容
【解决方案2】:

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

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

此外,我谦虚地认为您可能正在混合语言; CurrentThread 在 C# 中是一个类,但在 Java 中不是。

【讨论】:

  • 感谢本的解释。是的,你正确地理解了我的问题。我对 run 方法或 main 方法中的线程相互干扰感到困惑,我认为在某些时候可能会成为 main 方法中的当前线程(因为我扔了它),或者在某些时候可能会成为主线程AThread 的 run 方法中的当前线程,但这是不可能的,我是对的吗?
  • 每个线程都是不同的对象; run 方法与任何其他方法一样,它适用于调用它的实例。我不确定我是否遵循您在这里的要求。如果一个线程中抛出的异常只会在该线程中被处理(或忽略)——异常不会跨越线程边界。如果异常导致主线程提前退出,主线程产生的线程可以被孤立并继续在 jvm 中运行。
  • 对不起,我的意思是(因为我跑而不是“我扔了它”)
  • 啊。不,主线程或主线程始终是主线程。我想您可以设法使辅助线程成为主线程,但这比手头的问题更深。当您调用 AThread 的 run() 时,它是从 主线程调用的,因此是辅助线程。 “thread-a”是从 AThread 的 run() 方法实例运行的代码的角度来看的当前线程。另外,对于 C#/Java 注释,我很抱歉,我错过了最外面的类名:/
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 2011-11-20
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 2014-07-01
相关资源
最近更新 更多