java - 同步线程以按顺序执行操作

标签 java multithreading synchronized

我有一个方法

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/

相关文章:

java - 如何使用父标记对象查找内部子标记名列表

java - 重新启动 Java 游戏

c# - 多个线程同时读取静态变量

c# - 用于监视多线程 .NET 应用程序的工具、提示和技巧

powershell - 如何将项目动态添加到 PowerShell ArrayList 并使用运行空间池递归处理它们?

java - 在java中以原子方式获取多个锁

java - Spring 如何在不使用 @Component 或其他衍生物的情况下 Autowiring 组件

java - 登录无法使用登录表单

c - 基于优先级的多线程?

java - 在多线程情况下延迟初始化静态变量