我实际上是java领域的初学者,目前正在进行多线程概念
我遇到了一个程序,对程序本身有一些疑问。
以下是我的程序
public class SecondThreadDemo implements Runnable {
public void run() {
System.out.print(Thread.currentThread().getName());
}
}
class B implements Runnable {
public void run() {
new SecondThreadDemo().run();
new SecondThreadDemo().run();
new Thread(new SecondThreadDemo(), "T3").run();
new Thread(new SecondThreadDemo(), "T2").start();
new SecondThreadDemo().run();
new Thread(new SecondThreadDemo(), "T3").start();
}
}
class C {
public static void main(String[] args) {
new Thread(new B(), "T1").start();
}
}..
现在我期待的是以下输出
T1T1T1T1T3T3
但它就像
T1T1T1T1T2T3
有人可以澄清输出吗?
答案 0 :(得分:10)
run
和start
之间存在差异。
Runnable
本身不是Thread
所以它将与其余代码内联执行(比如调用任何其他方法)。
start
会安排一个可以run
Runnable
的帖子。
每次运行它时也会有差异,它将归结为线程调度的工作方式
例如,您的代码执行此操作...
new SecondThreadDemo().run();
new SecondThreadDemo().run();
new Thread(new SecondThreadDemo(), "T3").run();
new Thread(new SecondThreadDemo(), "T2").start();
new SecondThreadDemo().run();
new Thread(new SecondThreadDemo(), "T3").start();
这会(可能)输出类似......
的内容T1 (run)
T1 (run)
T1 (run) (cause I'm in T1's thread context)
// Then it all depends...this MIGHT be the output...
{T1} (run)
{T2} (start)
{T3} (start)
答案 1 :(得分:0)
只有在线程上调用start方法时,java中的新线程才会生成,这将在新线程中执行run方法中编写的代码。
但是如果直接在线程或runnable对象上调用run()方法,那么它将在执行的主线程中执行而不是在新线程中执行。
答案 2 :(得分:0)
new SecondThreadDemo().run();
- 简单函数调用,因此T1作为运行线程是T1
new SecondThreadDemo().run();
- 简单函数调用,因此T1作为运行线程是T1
new Thread(new SecondThreadDemo(), "T3").run();
- 简单函数调用,因此T1作为运行线程是T1
new Thread(new SecondThreadDemo(), "T2").start();
- 此时你正在创建一个名为T2并调用start的线程,这里它依赖于它可以打印T2或者可能是下一行将被执行并将在此线程打印T2之前打印T1
new SecondThreadDemo().run();
- T1简单函数调用
new Thread(new SecondThreadDemo(), "T3").start();
- T3符合预期
所以它依赖于JVM输出可以是T1T1T1T1T2T3或者可能是T1T1T1T2T1T3