2012-11-18 51 views
1

我目前停留在一个点功课,并想知道是否有人能帮助 -的Java信号量syncronize印刷筛选

我必须使用信号量在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每隔一排又一排!

任何帮助非常感谢,不看代码或任何东西只是几个指针如果可能的话:)

+0

虽然这不符合要求,但您可以使用Peterson算法实现此目的。 – nhahtdh

+0

将不会如果条件总是正确的? – twodayslate

+0

一旦printCount大于1,我将它重置为0,以便它可以重新开始,在produce()方法中 –

回答

2

你似乎是设置printA和printB信号灯起来而没有设定下来。如果他们试图成立多次,他们会自己等待。


要回答“我会在哪里设置它们?”的评论?

我不太确定,说实话。我能想象的唯一的事情是,如果教授试图利用这个事实(在java中),你可以释放比最初获得的信号更多的时间。

如果是这样,那么该模式将是两个信号量,一个用于生产者'B'和一个用于生产者'B'。他们的每种生产方法都会根据自己的信号采集并释放相对生产者的信号量。因此,信号计数是生产者没有从其他生产者发布相应版本而获得的次数,但这种方法与信号量的概念意图不一致,取决于Java特定的实现,只是彻头彻尾的让我感到不安。

我会尽早使用第三个管理器或使用者线程执行此操作,该线程执行限制或对共享整数使用互锁操作。无论哪种方式,不使用信号量。如果我们希望确保只有三个短暂的生产者自主执行信号量,它将会很有用。

+0

我将在哪里调用?我有 Semaphores.mutex.down(); System.out.println(produce());如果(printCount> 1) {printCount = 0; } Semaphores.mutex.up(); Semaphores.printB.up(); Semaphores.printA.down(); } Semaphores.mutex.up(); 但它仍然设法打印出3连续出于某种原因 –