直接在线程对象上调用Runnable的run()方法

时间:2015-06-24 15:59:03

标签: java multithreading

我们不能直接在线程的对象上调用Runnable的run()方法,但根据下面的程序,我们没有任何编译或运行时错误。为什么会这样?

public class ThreadCheck implements Runnable {

    @Override
    public void run() {
        for (int i=0; i<10; ) {
            System.out.println(++i);
        }
    }

    public static void main(String[] args) {
        Thread mythread = new Thread(new ThreadCheck());
        mythread.run();
        mythread.run();
        mythread.start();
    }   
}

输出: 1 2 3 4 五 6 7 8 9 10 1 2 3 4 五 6 7 8 9 10 1 2 3 4 五 6 7 8 9 10

4 个答案:

答案 0 :(得分:7)

这不会有任何编译或运行时错误。但它也不会产生新的线程。它将在当前主线程中执行run()方法。

参考what will happen if we directly call run method?

答案 1 :(得分:1)

我们可以直接在线程的对象上调用Runnable的run()方法。但是,当您从线程的对象中调用run()方法时,run()方法将作为常规方法工作。当你调用它时,它不会创建一个新线程。

在这种情况下,run()方法将被视为普通方法调用。但是当您在start()对象上调用Thread方法时,它会自动调用run()中新线程上的JVM方法。

答案 2 :(得分:0)

要创建/生成自定义新线程,需要做两件事:

  • 使用参数作为对象创建一个新的Thread对象(称之为线程) 自定义线程的引用(本例中为myThread)

  • 致电thread.start();

  

run()可以直接调用,但是序列   run方法中的执行不会在新线程中发生!该   执行顺序将在main方法的现有线程中进行。

答案 3 :(得分:0)

  

我们不能直接在线程的对象上调用Runnable的run()方法

事实并非如此。您的示例证明您可以调用它。但也许它没有按照你的想法做到。

有关Thread类与Runnable界面之间关系的简单说明,请参阅Two thread which invokes wait and notify