Java 为什么线程按这种顺序工作?
我有三门课:Main、Caller和CallMe调用方实现可运行。我将指向CallMe实例的指针传递给CallMe构造函数,并将Caller传递给打印消息的CallMe实例方法的消息传递给该方法。接下来,我开始一个线程 在Main中,我创建了Caller和I的3个实例,但在这里它将被打印:Java 为什么线程按这种顺序工作?,java,multithreading,Java,Multithreading,我有三门课:Main、Caller和CallMe调用方实现可运行。我将指向CallMe实例的指针传递给CallMe构造函数,并将Caller传递给打印消息的CallMe实例方法的消息传递给该方法。接下来,我开始一个线程 在Main中,我创建了Caller和I的3个实例,但在这里它将被打印: [Welcome] [to synchronized] [world!] 但我得到了以下结果: [Welcome] [world!] [to synchronized] 为什么? 有代码: Main.ja
[Welcome]
[to synchronized]
[world!]
但我得到了以下结果:
[Welcome]
[world!]
[to synchronized]
为什么?
有代码:
Main.java
Caller.java
CallMe.java
main方法中调用方的三个实例化可能都发生在一个时间片内,即不向另一个线程屈服。这将导致创建所有三个线程并将其置于可运行状态。在那之后,线程可以按任何顺序调度,所以你只是运气不好
如果希望线程按特定顺序执行,则需要自己提供联锁逻辑。主方法中调用方的三个实例化可能都发生在一个时间片内,即不向另一个线程屈服。这将导致创建所有三个线程并将其置于可运行状态。在那之后,线程可以按任何顺序调度,所以你只是运气不好
如果希望线程按特定顺序执行,则需要自己提供联锁逻辑。为什么希望线程按特定顺序运行?按顺序创建它们并不能保证它们按顺序执行。@DanielGibbs我认为按顺序创建它们可以设置线程的执行顺序。不,一点也不。请阅读。为什么您希望它们按特定顺序运行?按顺序创建它们并不能保证它们按顺序执行。@DanielGibbs我认为按顺序创建它们可以设置线程的执行顺序。不,一点也不。当然,我读过《AndyTurner》,但我认为这是多线程编程中的自我教育。我认为“只做一个线程!”是一个非常有用的东西,可以被认为是一个选项。当然,AndyTurner,但我认为这是多线程编程中的自我教育。我想“只需在一个线程中完成它。”学习是一个非常有用的事情。
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);
}
}
}
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);
}
}
}
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("]");
}
}