关于多线程的混淆

时间:2013-07-18 05:09:10

标签: java multithreading

我实际上是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

有人可以澄清输出吗?

3 个答案:

答案 0 :(得分:10)

runstart之间存在差异。

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