java - start() 方法从 start() 调用线程......令人困惑

标签 java multithreading lwjgl

我一直在摆弄创建一个运行渲染的线程,并且我遇到了这种实现它的方法:

Class Main implements Runnable {
private Thread thread;
private boolean running = false;

public void start() {
            running = true;
    thread = new Thread(this, "renderingThread")
    thread.start(); //calls run()
}

    public void run() {

    init(); //init glfw + create window

    while(running) {
        update();
        render();
    }
}

    public static void main(String[] args) {
        new Main().start()
    }

请注意,仅包含与线程相关的代码部分。

现在,程序流程看起来像这样(如果我错了请纠正我):构造Main类型/类的新对象(因此,在堆上保留一个位置)。然后,调用 Main 类型对象的 start() 方法。 running boolean 值设置为 true。然后,通过构造函数 Thread (Runnable target, String name) 创建一个新线程 - 在我的例子中,第一个参数是 this 关键字,意味着对象的引用Main 类型作为第一个参数传递(因为该方法已由 Main 类型的对象调用)。然后,下一行是最让我烦恼的。 thread 引用调用方法 start(),但它以某种方式引用 run() 方法。怎么办?

我非常感谢您对线程对象的 start() 方法如何引用 run() 方法进行彻底的解释。

最佳答案

您创建一个新的Thread,其Runnable目标为this(Main类的实例)。 Main 实现 Runnable 意味着方法 run() 被重写。 Thread 类本身实现了 Runnable

当您使用上面的配置启动线程时,方法 start() 会导致线程开始执行;然后,Java 虚拟机调用 Thread 对象的 run() 方法。 documentation中说。如果您好奇,请查看 java.lang.Thread 的源代码.

您可以用更简单的方法达到相同的效果:

public class Main implements Runnable { 

    @Override
    public void run() {
        System.out.println("New thread");
    }

    public static void main(String[] args) {
        new Thread(new Main()).start();
        System.out.println("Main thread");
    }
}

关于java - start() 方法从 start() 调用线程......令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48814386/

相关文章:

java - Oozie Java Action 和Spark Action 在同一工作流程中出现错误

java - 从函数构建端点值 - 注释属性 X 的值必须是常量表达式

C++ 将对象传递给线程

java - 如何阻止草地拖慢我的游戏速度?

java - 如何在 .jar 中使用纹理?

java - LWJGL 无法使用 VBO 创建立方体

java - 将 glCanvas 放置在包含按钮的 JPanel 旁边

java - 每个请求的 Spring session 创建策略?

java - 当线程 A 死亡时,线程 B 在线程 A 中产生的行为

c++ - 一种销毁 "thread"类的方法