gpt4 book ai didi

java - 当我使用 currentThread() 时 "main"是什么意思?我是否正确使用多线程?

转载 作者:行者123 更新时间:2023-12-01 20:56:23 27 4
gpt4 key购买 nike

我目前正在熟悉 Java 中的线程和多线程。我正在做一个简单的练习,我必须根据运行时传递给函数的 N 个线程将数组分成相等的分区。

但是,我很想知道我是否实际上在每个线程中执行 mergeSort(),或者它只是作为单个线程运行。我做了一个 for 循环,它类似于 Thread.start() ,后跟一个 try-catch block ,其中将调用 Thread.join() ,然后我将使用 Thread.currentThread() 打印名称。然而,我在整个执行过程中都得到了“main”这个词。

这是否意味着我并不是真正的多线程?我的想法是我会得到类似 Thread-0... 的东西,但只有当我执行 Thread.getName(); 时我才会得到它;

请指教。

for (MedianMultiThread mmt : threadList) {
mmt.start();
try {
mmt.join();
sortedSubArrays.add(mmt.getInternal());
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}

编辑:意识到我正在线程中运行 currentThread() ,但是当我在 run() 方法中运行它时,我得到了不同的结果。谢谢大家!

最佳答案

thread.currentThread() 方法的名称让很多人感到困惑。 thread.currentThread()不会返回“当前线程”,除非您碰巧认为“当前线程”意味着调用该函数的线程。

这就是thread.currentThread()实际所做的:它返回对调用它的线程的引用。如果它总是在您的程序中返回“main”,那么这意味着您的程序仅从 main() 线程调用它。

<小时/>

这个名字来自很久以前,当时大多数计算机只有一个 CPU,它对于编写线程调度代码的人来说应该有某种意义。如果您正在为一台 CPU 机器编写调度程序,那么在任何给定时间都不会有多个线程在运行。很自然地将其称为“当前线程”。

在单 CPU 系统上运行的老式 Unix 风格操作系统中,返回当前线程标识的系统调用只能返回调用它的线程标识。

事实证明这在用户空间程序中非常有用。

“当前线程”的概念在现代多处理器系统上没有多大意义,但是返回调用线程标识的系统调用仍然像以前一样有用。

不幸的是,我们仍然使用它的旧名称。

<小时/>

附注,这没有任何意义:

mmt.start();
try {
mmt.join();
...
} catch (...) {
...
}

没有任何理由拥有两个(或更多)线程,除非它们可以同时做一些有用的事情。在您的代码示例中,一个线程启动第二个线程,然后第一个线程除了等待第二个线程完成之外什么都不做。

您可能已经完成了第一个线程中的所有工作。

关于java - 当我使用 currentThread() 时 "main"是什么意思?我是否正确使用多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42299398/

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