start()方法从start()调用一个线程......令人困惑

时间:2018-02-15 18:55:09

标签: 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 ()方法。 运行布尔值设置为true。然后,通过构造函数 Thread(Runnable target,String name)创建一个新线程 - 在我的例子中,第一个参数是 this 关键字,意味着该对象的引用Main类型作为第一个参数传递(因为该方法已由Main类型的对象调用)。然后,下一行是最让我烦恼的东西。 线程引用调用方法 start (),但它以某种方式引用 run ()方法。怎么样?

我非常感谢能够详细解释 start ()方法如何为线程对象引用 run ()方法。

2 个答案:

答案 0 :(得分:2)

您创建了一个新的Thread,其Runnable目标为thisMain类的实例)。 Main implements 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");
    }
}

答案 1 :(得分:0)

看看JavaDoc(https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#start--

当在run()对象上调用start()时,它会创建一个新的Thread并在该线程上调用EditorViewData方法。