gpt4 book ai didi

java - 为什么线程按这个顺序工作?

转载 作者:行者123 更新时间:2023-12-01 16:53:28 24 4
gpt4 key购买 nike

我有 3 个类:MainCallerCallMe调用者实现Runnable。我向 Caller 构造函数传递一个指向 CallMe 实例的指针,以及 Caller 传递给 CallMe 实例方法的消息> 打印消息。接下来,我开始一个线程。

Main 中,我创建了 3 个 Caller 实例,但这里将打印它:

[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("]");
}
}

最佳答案

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

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

关于java - 为什么线程按这个顺序工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35998797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com