当前线程方法java

当前线程方法java,java,multithreading,Java,Multithreading,因此,我正在尝试为我正在制作的游戏使用线程。我对这门学科不太熟悉,所以可能理解不正确。我的问题是currentThread()方法在java API的Thread类中是如何工作的。API说“返回对当前正在执行的线程对象的引用”,但据我所知,多个线程同时运行。怎么可能只返回一个执行线程呢?调用currentThread的代码将在其中一个线程中执行,而不是在所有线程中执行,因此它可以具体地获取该线程。执行代码中的指令时,它将在特定线程中执行。这是该方法返回的线程 显然,如果一个特定的方法由多个线程执

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

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

执行代码中的指令时,它将在特定线程中执行。这是该方法返回的线程

显然,如果一个特定的方法由多个线程执行,则每次执行可能会为
Thread.currentThread()
返回不同的值

您可以尝试这个简短的示例,以更好地了解正在发生的事情,特别是两个线程并行执行的事实。您应该看到t1将运行一些循环,然后t2将执行相同的操作,然后返回到t1等(您可能需要根据您的机器将循环数从5增加到更高的数目):

公共类TestThread{
公共静态void main(字符串[]args){
Runnable r=新的Runnable(){
@凌驾
公开募捐{
对于(int i=0;i<5;i++){
System.out.println(Thread.currentThread());
}
}
};
螺纹t1=新螺纹(r,“t1”);
螺纹t2=新螺纹(r,“t2”);
t1.start();
t2.start();
}
}

“当前正在执行的线程”表示系统调度程序给该线程一些时间来执行其代码

多个线程未同时运行,并且多个线程之间存在线程切换。处理器一次可以执行一个任务,因此一次只能执行一个线程。因此,我们得到了当前运行线程的引用。

假设您在一张纸上打印了指令列表。一个人阅读说明并执行。这些指令是一个程序。人是一根线。你可以复印许多份报纸,然后分发给许多人。如果说明书上写着“打你自己”之类的话,那么“你自己”指的是谁在读那份报纸上的说明书。同样地,
Thread.currentThread()
指的是执行调用
currentThread()

的线程在编写单线程应用程序时,您可以像一系列指令一样对程序进行推理,每一条指令都在前一条指令完成后执行(这是一个粗略的近似,但从概念上讲,编译器和处理器试图模拟这种情况,并将其视为实际发生的情况)

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

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


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

在任何给定时间点,只有一个线程将执行(活动),因此
thread.currentThread()
返回当前执行线程的详细信息。例如,线程名称、优先级、方法名称。

您应该阅读一些关于线程的教程。我认为他们应该将其命名为getSelfThread()或者诸如此类,因为当前可以有多个线程使用多核CPU执行。为什么需要在循环中打印当前线程?我想,一次就足够了。我喜欢你的前两句话……但文章的其余部分,特别是代码,似乎不够模糊,足以产生误导。@Jeffrey,这个想法就是要说明的一些交错,其中一个线程可能运行两次循环,而另一个线程则处于活动状态,等等。@chris同样的评论。我应该更明确地说明这一点。多核机器确实一次运行多个线程。我有一个大规模多线程程序(具有高度交互的线程)在一台单核机器上工作,然后将其移动到一台有4核的机器上。这是一个真正的教育。“多个线程不一定同时运行…”
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();
    }
}