当前线程方法Java

9

我正在开发一个游戏,需要使用线程。由于对这个主题非常陌生,因此可能理解不正确。我的问题是java API中Thread类中的currentThread()方法如何工作。API说“返回对当前执行线程对象的引用”,但据我所知,多个线程同时运行。如何可能仅返回一个正在执行的线程?


你应该阅读一些关于线程的教程。 - Simon Dorociak
3
我认为它们应该将其命名为getSelfThread()或类似的名称,因为在多核CPU上可以有多个正在执行的线程。 - goat
7个回答

7

调用currentThread的代码将在其中一个线程中执行,而不是所有线程中执行,因此它可以获取该特定线程。


5
假设你有一张纸上印着一系列指令。一个人阅读这些指令并执行它们。这些指令就是一个程序,而这个人就是一个线程。你可以复制很多份这张纸并分发给很多人。如果这些指令中有像“打自己”这样的话,自己就指代那个正在从那张纸上读取这条指令的人。同样地,Thread.currentThread()指的是正在执行该调用currentThread()的线程。

5
当您的代码中的指令被执行时,它是在特定线程内执行的。这是该方法返回的线程。
显然,如果一个特定方法被多个线程执行,每次执行可能会为Thread.currentThread()返回不同的值。
您可以尝试这个简短的示例来更好地理解发生了什么,特别是2个线程并行执行的事实。你应该看到t1会运行几次循环然后t2会做相同的事情并回到t1等等(您可能需要增加循环次数从5到更高的数字取决于您的机器)。
public class TestThread {

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println(Thread.currentThread());
                }
            }
        };

        Thread t1 = new Thread(r, "t1");
        Thread t2 = new Thread(r, "t2");
        t1.start();
        t2.start();
    }
}

1
为什么需要在循环中打印出当前线程?我认为一次就足够了。 - Jeffrey
我喜欢你的前两句话...但是帖子的其余部分,特别是代码,似乎含糊不清,容易引起误解。 - goat
@Jeffrey,这个想法是展示一些交错执行的情况,其中一个线程可能会运行两次循环,然后另一个线程变为活动状态等等。 - assylias
@chris 同样的评论。我可能应该更明确地表达它。 - assylias

0
在任何时刻,只有一个线程正在执行,因此Thread.currentThread()返回当前正在执行的线程的详细信息,例如线程名称、优先级和方法名。

0
"

当前正在执行的线程

" 意味着系统调度程序给了这个线程一些时间来执行其代码。

0

当编写单线程应用程序时,您可以将程序视为一系列指令,每个指令在前一个指令完成后执行(这是一个粗略的近似,但在概念上,编译器和处理器试图模拟并像真正发生的那样工作)。

当使用多个线程时,每个线程都有自己的指令序列。创建新线程时会传递一个入口点(方法),并将从该点继续执行。每个线程在执行中独立于其他线程(它只会简单地一个接一个地执行指令),尽管它们共享内存,因此一个线程的副作用可能会影响另一个线程。

因此,要执行某些代码,必须在一个线程的上下文中执行(在应用程序启动时操作系统会创建一个线程,在Main方法处开始执行)。调用currentThread函数时,它就在其中一个上下文中。

Java运行时在创建线程时将在线程上下文中存储对该Thread对象的引用,而currentThread只需查找并返回当前线程。


-1

多个线程不会同时运行,而是在多个线程之间进行线程切换。处理器一次只能执行一个任务,因此一次只能执行一个线程。因此,我们可以获得当前正在运行的线程的引用。


多核机器确实可以同时运行多个线程。我曾经在单核机器上成功地运行了一个高度交互的大规模多线程程序,然后将其移植到了一台有4个核心的机器上。这是一次真正的教育。 - RalphChapin
多个线程不一定同时运行... - user1531971

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接