并非所有线程都用于调用方法

时间:2021-07-10 20:13:43

标签: java multithreading

我正在使用 Thread 构造函数来创建线程。我期待下面的代码由 3 个单独的线程和不同的输出执行。 任何人都可以解释为什么输出与我的理解不同(为什么线程 2 用于调用 m1 两次而不是 t3)?

代码:-

public static void main( String[] args ) {
        new SynchronizedExample().execute();
}

void execute() {
    SynchronizedExample s1 = new SynchronizedExample();

    Thread t1 = new Thread(s1::m1);
    Thread t2 = new Thread(s1::m1);
    Thread t3 = new Thread(s1::m2);
    t1.start();
    t2.start();
    t3.start();
}

public synchronized void m1(){
    try {
        System.out.println("Current Thread - " + Thread.currentThread().getName());
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("M1");
}

public void m2() {
    System.out.println("M2");
}
}

输出:-

Current Thread - Thread-0
M2
M1
Current Thread - Thread-1
M1

预期输出:-

Current Thread - Thread-0
M2
Current Thread - Thread-1
M1
Current Thread - Thread-2
M1

1 个答案:

答案 0 :(得分:3)

你把它搞糊涂了。

我将注释您的输出:

<块引用>
Current Thread - Thread-0 [t1 - m1]
M2 [t3 - m2]
M1 [t1 - m1]
Current Thread - Thread-1 [t2 - m1]
M1 [t2 - m1]

您的代码打印了一些东西,然后等待,然后打印更多。因此,单个方法将其 System.out 行涂抹在第一行和第三行上。您的 m2 方法根本不打印 Current Thread - ...,因此您所期望的显然不可能发生。添加打印。