run()和start()之间的Java多线程差异

时间:2014-11-25 06:15:26

标签: java multithreading

我在thread.run()&&之间混淆了thread.start()方法因为

thread.start() - >启动新线程,以便更改线程名称(显然)

thread.run() - >虽然根据以下程序线程的名称被更改,但是没有启动新线程(在主线程上运行)。

为什么上帝为什么?

public class DemoClass {
    public static void main(String[] z) {
        Thread t = Thread.currentThread();
        System.out.println("Main thread : " + t.getName());

        MyThread thread = new MyThread();
        thread.run();
        thread.start();
    }
}

public class MyThread extends Thread {
    public void run() {
        System.out.println("Important job running in MyThread");
        System.out.println("run : " + this.getName());

    }       
}

O / p:

Main thread : main
Important job running in MyThread
run : Thread-0
Important job running in MyThread
run : Thread-0

如果我对某些概念不对,请纠正我。

8 个答案:

答案 0 :(得分:2)

没有thread.run()。如果通过显式调用run()方法来启动run方法,它将不会充当线程(即并行执行)。这只是一个普通的方法调用。如果thread.start()在内部,它将调用{{ 1}}方法并启动并行执行。

答案 1 :(得分:2)

来自horse's mouth

  

public void run()

     

如果使用单独的Runnable运行对象构造此线程,则调用该Runnable对象的run方法;否则,此方法不执行任何操作并返回

     

public void start()

     

使该线程开始执行; Java虚拟机调用此线程的run方法。

run方法是Runnable接口的一部分,它不需要使用单独的线程来执行。将在当前执行上下文中执行对Runnable.run方法的调用。

start然而 方法调用一个线程来实际启动它,并让其run方法中的代码从调用线程异步执行。

例如,您绝对可以覆盖run实例的Thread方法,并将此实例传递给另一个Thread实例,就像它只是一个简单的Runnable实例一样1}}。

从开头引用的文档中可以看出,run类上的Thread方法是为了方便而提供的:它让jvm轻松访问线程的Runnable部分而不必直接公开Runnable对象,但它也为程序员提供了一种直接在线程中嵌入Runnable部分的方法,绕过了单独对象的需要。

答案 2 :(得分:1)

令人惊讶的是,有多少人可以通过重复OP已经编写的内容而无需回答问题来回答问题。

解决方案是你首先要求提供正在运行的线程的名称,但是第二次你要求代码或执行的线程保险的名称。如果您将更晚的内容更改为Thread.currentThread而不是this,您将获得预期的答案。

答案 3 :(得分:0)

当我们每次创建一个新的Thread时调用start()方法并且另一方面用新创建的Thread执行run()方法内的逻辑如果应用程序直接调用run()方法没有新线程已创建,run()内的逻辑将在当前正在执行的Thread上执行。

此外,您无法在线程对象上调用start()方法两次。一旦启动,start()的第二次调用将在Java中抛出IllegalStateException,而您可以两次调用run()方法。

答案 4 :(得分:0)

  

为什么上帝为什么?

Java开发人员不知道当他们为Thread“run”命名主要入口点时会产生多少混淆。

当您在调用r时传递显式Runnable new Thread(r)时,Runnable对象将成为线程的委托。当Java是新的时,委托并没有被广泛使用。我敢打赌,如果他们可以从头开始,就没有公开的Thread.run()来混淆新手,而委托将是唯一的方式来指定新线程的行为方式。

答案 5 :(得分:0)

您正在调用thread.getName(),显然要在线程对象上执行。相反,你应该尝试像Thread.currentThread.getName();这将为您提供当前运行的线程的名称。

答案 6 :(得分:-1)

http://www.vogella.com/tutorials/JavaConcurrency/article.html

您肯定需要使用执行程序池!

真正好的文章。

答案 7 :(得分:-1)

start() - 仅调度线程执行但实际上并未开始执行。 run() - 当JVM调用run方法时,会声明实际执行。