9

所以我正在尝试为我正在制作的游戏使用线程。我对这个主题陌生,所以我可能无法正确理解。我的问题是 currentThread() 方法如何在 java API 的 Thread 类中工作。API 说“返回对当前正在执行的线程对象的引用。”,但据我所知,多个线程同时运行。怎么可能只返回一个执行线程?

4

7 回答 7

7

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

于 2012-05-31T22:46:44.050 回答
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();
    }
}
于 2012-05-31T22:46:50.960 回答
5

假设您在一张纸上打印了一系列说明。一个人阅读说明并执行它们。指令是一个程序。人是一根线。你可以复印很多份报纸,然后分发给很多人。如果说明说“打自己一巴掌”,那么您自己指的是正在阅读该文件中该说明的任何人。同样,Thread.currentThread()指的是执行该调用的线程currentThread()

于 2012-05-31T22:57:42.263 回答
0

在编写单线程应用程序时,您可以对程序进行推理,就像一系列指令一样,每条指令都在前一条指令完成后执行(这是一个粗略的近似,但从概念上讲,编译器和处理器会尝试模拟它并像这真的一样工作发生了什么事)。

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

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

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

于 2012-05-31T23:04:39.527 回答
0

“当前正在执行的线程”意味着系统调度器给了这个线程一些时间来执行它的代码。

于 2012-05-31T22:47:29.530 回答
0

在任何给定的时间点,只有一个线程正在执行(live),因此Thread.currentThread()返回当前正在执行的线程的详细信息。例如,Thread_name、priority、method_name。

于 2017-02-13T15:26:06.377 回答
-1

多个线程没有同时运行,多个线程之间存在线程切换。处理器一次可以执行一项任务,因此一次执行一个线程。所以我们得到当前正在运行的线程的引用。

于 2012-05-31T22:54:11.367 回答