为什么线程按此顺序工作?

TiP*_*iPo 0 java multithreading

我有3个课程:Main,CallerCallMe.调用者实现了Runnable.我向Calller constuctor 传递一个指向CallMe实例的指针,以及一条消息,Caller传递给CallMe实例的方法,打印消息.接下来,我开始一个线程.

Main中我创建了3个Caller和I 实例,除了它将在这里打印:

[Welcome]
[to synchronized]
[world!]
Run Code Online (Sandbox Code Playgroud)

但我得到以下结果:

[Welcome]
[world!]
[to synchronized]
Run Code Online (Sandbox Code Playgroud)

为什么?

有代码:

Main.java

public class Main {
    public static void main(String[] args) {
        CallMe target = new CallMe();
        Caller ob1 = new Caller(target, "Welcome");
        Caller ob2 = new Caller(target, "to synchronized");
        Caller ob3 = new Caller(target, "world!");

        try {
            ob1.thread.join();
            ob2.thread.join();
            ob3.thread.join();
        } catch (InterruptedException exc) {
            System.out.println(exc);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Caller.java

public class Caller implements Runnable {
    String message;
    CallMe target;
    Thread thread;

    public Caller(CallMe target, String message) {
        this.target = target;
        this.message = message;
        this.thread = new Thread(this);
        this.thread.start();
    }

    public void run() {
        synchronized (target) {
            target.call(message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

CallMe.java

public class CallMe {    
    public void call(String msg) {
        System.out.print("[" + msg);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException exc) {
            System.out.println(exc);
        }
        System.out.println("]");
    }
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*son 5

Caller主方法中的三个实例可能都发生在一个时间片内,即不会屈服于另一个线程.这导致创建所有三个线程并将其置于可运行状态.之后,可以按任何顺序安排线程,所以你只是运气不好.

如果您希望线程按特定顺序执行,则需要自己提供互锁逻辑.