我有3个课程:主要,来电和 CallMe 。 来电者实施可运行。我向来电者构建器传递指向 CallMe 实例的指针以及来电者传递给 CallMe 实例方法的消息>打印消息。接下来,我开始一个线程。
在主要中,我创建了来电者的3个实例,我将在此处打印:
[Welcome]
[to synchronized]
[world!]
但我得到以下结果:
[Welcome]
[world!]
[to synchronized]
为什么吗
有代码:
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);
}
}
}
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);
}
}
}
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("]");
}
}
答案 0 :(得分:5)
主方法中Caller
的三个实例化可能都发生在一个时间片内,即没有屈服于另一个线程。这导致创建所有三个线程并将其置于可运行状态。之后,可以按任何顺序安排线程,所以你只是运气不好。
如果您希望线程按特定顺序执行,则需要自己提供互锁逻辑。