TiP*_*iPo 0 java multithreading
我有3个课程:Main,Caller和CallMe.调用者实现了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)
Caller主方法中的三个实例可能都发生在一个时间片内,即不会屈服于另一个线程.这导致创建所有三个线程并将其置于可运行状态.之后,可以按任何顺序安排线程,所以你只是运气不好.
如果您希望线程按特定顺序执行,则需要自己提供互锁逻辑.
| 归档时间: |
|
| 查看次数: |
36 次 |
| 最近记录: |