所以我正在尝试为我正在制作的游戏使用线程。我对这个主题很陌生,所以我可能无法正确理解。我的问题是 currentThread() 方法如何在 java API 的 Thread 类中工作。API 说“返回对当前正在执行的线程对象的引用。”,但据我所知,多个线程同时运行。怎么可能只返回一个执行线程?
7 回答
调用的代码currentThread
将在其中一个线程中执行,而不是在所有线程中执行,因此它可以专门获取该线程。
当执行代码中的指令时,它会在特定线程中执行。这是该方法返回的线程。
显然,如果一个特定的方法由多个线程执行,每次执行可能会返回不同的值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();
}
}
假设您在一张纸上打印了一系列说明。一个人阅读说明并执行它们。指令是一个程序。人是一根线。你可以复印很多份报纸,然后分发给很多人。如果说明说“打自己一巴掌”,那么您自己指的是正在阅读该文件中该说明的任何人。同样,Thread.currentThread()
指的是执行该调用的线程currentThread()
。
在编写单线程应用程序时,您可以对程序进行推理,就像一系列指令一样,每条指令都在前一条指令完成后执行(这是一个粗略的近似,但从概念上讲,编译器和处理器会尝试模拟它并像这真的一样工作发生了什么事)。
当你使用多线程时,每个线程都有自己的一系列指令。新线程在创建时会传递一个入口点(一种方法),并将继续从它们执行。每个线程在执行过程中都独立于另一个线程(它只会一个接一个地执行一条指令),尽管它们共享内存,因此一个线程的副作用会影响另一个线程。
因此,对于要执行的某些代码,它必须在一个线程的上下文中完成(当您的应用程序启动时,操作系统会创建一个线程,它会在Main
方法处开始执行)。调用该函数时currentThread
,它处于其中一种上下文中。
创建线程时的 java 运行时会将对该Thread
对象的引用存储在线程上下文中,并且currentThread
只会在那里查找并返回当前线程。
“当前正在执行的线程”意味着系统调度器给了这个线程一些时间来执行它的代码。
在任何给定的时间点,只有一个线程正在执行(live),因此Thread.currentThread()
返回当前正在执行的线程的详细信息。例如,Thread_name、priority、method_name。
多个线程没有同时运行,多个线程之间存在线程切换。处理器一次可以执行一项任务,因此一次执行一个线程。所以我们得到当前正在运行的线程的引用。