0

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

有人可以澄清输出吗?

4

3 回答 3

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)
于 2013-07-18T05:14:27.377 回答
0

仅当您在线程上调用 start 方法时,java 中的新线程才会产生,该方法将在新线程中执行 run 方法中编写的代码。

但是,如果您直接在线程或可运行对象上调用 run() 方法,那么它将在执行的主线程中执行,而不是在新线程中执行。

于 2013-07-18T05:34:51.773 回答
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

于 2013-07-18T07:28:48.000 回答