gpt4 book ai didi

Java信号量同步打印到屏幕

转载 作者:行者123 更新时间:2023-11-30 04:36:14 24 4
gpt4 key购买 nike

我目前正在做一些家庭作业,想知道是否有人可以提供帮助 -

我必须在java中使用信号量来同步从2个线程打印字母——一个打印“A”,一个打印“B”。我无法连续打印出 2 个以上的相同字符,因此输出应如下所示

AABABABABABBABABABABAABBAABBABABA

目前我有 3 个信号量、一个设置为 1 的二进制互斥体和一个计数信号量,我的线程类看起来像这样 -

public void run() {
while (true) {
Time.delay(RandomGenerator.integer(0,20));
Semaphores.mutex.down ();
System.out.println (produce());

if (printCount > 1)
{ printCount = 0;
Semaphores.mutex.up ();
Semaphores.printB.up();
}
}
}
public String produce() {
printCount++;
return "A";
}


public void run() {
while (true) {
Time.delay(RandomGenerator.integer(0,20));
Semaphores.mutex.down ();
System.out.println (produce());

if (printCount > 1)
{ printCount = 0;
Semaphores.mutex.up ();
Semaphores.printA.up();
}
}
}
public String produce() {
printCount++;
return "B";
}

然而,无论我尝试什么,它要么死锁,要么似乎最多只能连续打印 2 个,但似乎总是时不时地连续打印 3 个!

非常感谢任何帮助,不要查看代码或任何内容,如果可能的话,只是一些指针:)

最佳答案

您似乎正在设置 printA 和 printB 信号量,但从未将其设置下来。如果尝试多次设置它们,它们就会自行等待。

<小时/>

回答“我要把它们放在哪里?”的评论。

说实话,我不太确定。我唯一能想象的是,教授是否试图利用这样一个事实:(在java中)你可以比最初获取的信号量更多地释放信号量。

如果是这样,那么该模式将是两个信号量,一个用于生产者“B”,一个用于生产者“B”。他们的每个生产方法都会在自己的信号量上获取并在对方生产者的信号量上释放。因此,信号量计数将是生产者在没有来自其他生产者的相应释放的情况下获取的次数,但这种方法与信号量的概念意图不一致,取决于 Java 特定的实现,并且完全让我感到不安。

我会更快地使用第三个管理器或消费者线程来进行限制或通过对共享整数使用互锁操作来实现此目的。无论哪种方式,都不使用信号量。如果我们想确保只有三个短暂的生产者自主执行,信号量将很有用

关于Java信号量同步打印到屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13442100/

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