我在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
如果我对某些概念不对,请纠正我。
答案 0 :(得分:2)
没有thread.run()
。如果通过显式调用run()
方法来启动run方法,它将不会充当线程(即并行执行)。这只是一个普通的方法调用。如果thread.start()
在内部,它将调用{{ 1}}方法并启动并行执行。
答案 1 :(得分:2)
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)
答案 7 :(得分:-1)
start() - 仅调度线程执行但实际上并未开始执行。 run() - 当JVM调用run方法时,会声明实际执行。