我有一个方法
public static synchronized void print(String message, int sleepTime) throws InterruptedException {
System.out.println(message);
Thread.sleep(sleepTime);
}
调用此方法会打印我给它的任何消息,并导致调用它的线程暂停指定的时间。 static synchronized
使得此类的多个线程必须同步它们的 print
以便在另一个线程完成 hibernate 之前没有线程可以开始打印(第一个线程除外)当然是调用 print
)
在我的代码的其他地方,我有调用线程这样做:
print("some message", 1000);
print("some other message", 1000);
我使用此代码运行的每次试验都会导致所有线程首先打印第一条消息“一些消息”,然后所有线程最后打印“一些其他消息”。
例如,如果我有3个线程,预期结果如下(我运行几次代码就可以得到):
some message
some message
some message
some other message
some other message
some other message
诚然,我还没有运行那么多试验。
但是,我怀疑完成打印第一条消息的线程(我们称此线程 A)随后会与可能尚未打印第一条消息的其他线程竞争(我们称其中一个这样的线程 B)。 调度程序是否有可能在第一次选择 B 之前第二次选择 A,从而导致在第一个消息的所有实例打印完成之前在某处打印第二条消息?
换句话说,这是否可能发生:
some message
some message
some other message
some message
some other message
some other message
如果上述顺序是可能的,我怎么保证它不会发生呢?我如何保证第一个序列是总是发生的序列?
最佳答案
这取决于你所说的可能是什么意思。绝对没有禁止它的规则。但是,您在使用的实现中所做的特定设计选择可能使其无法实际发生。
关于java - 同步线程以按顺序执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40823474/