Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将打印同步到屏幕的Java信号量_Java_Multithreading - Fatal编程技术网

将打印同步到屏幕的Java信号量

将打印同步到屏幕的Java信号量,java,multithreading,Java,Multithreading,我现在正忙着做一些家庭作业,想知道是否有人能帮我- 我必须在java中使用信号量来同步打印来自两个线程的字母——一个打印“A”,一个打印“B”。我无法在一行中打印出超过2个相同字符,因此输出应该如下所示 巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴 目前,我有3个信号量,一个二进制互斥设置为1,一个计数信号量,我的线程类如下所示- public void run() { while (true) {

我现在正忙着做一些家庭作业,想知道是否有人能帮我-

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

巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴

目前,我有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”。他们的每一个product方法都将获取自己的信号量,并释放对方的信号量。因此,信号量计数将是生产者在没有从另一生产者获得相应版本的情况下获得的次数,但是这种方法与信号量的概念意图不一致,取决于Java特定的实现,并且直接让我感到不安


我更愿意使用第三个执行节流的管理器或使用者线程或对共享整数使用联锁操作来实现这一点。不管怎样,都不要使用信号灯。如果我们想确保只有三个短期生产者自动执行,那么信号量将非常有用

尽管这不符合要求,但您可以使用Peterson算法。if条件是否总是为真?一旦printCount大于1,我将其重置为0,以便它可以在Product()中重新开始我在哪里打电话?我有信号量。mutex.down();System.out.println(product());如果(printCount>1){printCount=0;Semaphores.mutex.up();Semaphores.printB.up();Semaphores.printA.down();}Semaphores.mutex.up();但出于某种原因,它有时仍能连续打印出3张