2012-04-04 18 views
2

我有3个班。服务员(线程),表(线程)和队列(不是线程)(类似于先进先出队列)。如何使用同步原语来帮助Waiters在java中服务表?

最初几个服务员正在创建,然后创建表。比服务员有更多的桌子,所以桌子必须“等待”服务员为他们服务。我应该使用“java同步原语,等待notify和notifall”来解决这个问题。这里是每个类的指导原则:

表: 它启动时,它进入队列,然后调用一个内部方法waitService(),如果它已被服务或等待服务员返回。

我现在所拥有的这种方法的方式:

$if(serviced) 
     return 0; 
    try { 
     this.wait(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

服务员: 服务员的代码是不是真的给我任何问题,但实质上它的工作方式是,在run方法有一个无限循环它检查是否有一个表正在等待,然后给该表服务一段随机的时间,然后检查是否有另一个表正在等待。它通过调用表类中的giveService()方法让表知道它正在给它提供服务。

队列: 它有服务员的名单和表格的列表。服务员在准备好提供服务时调用队列类中的nextTable()。这是我如何设置:

$public Table nextTable(Waiter w) throws InterruptedException { 

    if(closed) 
     return null; 
    if(tables.isEmpty()) { 
     w.wait(); 
    } 
    Table t = tables.removeFirst(); 
    t.notify(); 
    return t; 
} 

我知道上面可能有一些非常基本的错误,但基本上我不知道如何同步原语在java中工作。任何帮助,将不胜感激。

+0

这功课吗?它应该被标记为这样。 – Gray 2012-04-04 13:59:29

+2

是啊,它可是我不知道的方式来问这个问题,但没有提及实际硬件。我不希望有人为我解决它,只是有人可以解释如何在java中使用同步。 – bfresh 2012-04-04 14:01:04

+1

没问题。我只是指出它应该有作业标签。 – Gray 2012-04-04 14:02:15

回答

1

这是一个很好的教程为任何使用的wait(),通知()和notifyAll的()。首先仔细阅读,看看你是否还有其他的问题,或者SO还没有回答,或者是你的问题。

http://www.java-samples.com/showtutorial.php?tutorialid=306

+0

事情是没有的我的方法(如由HW定义)中的定义是同步的。即它们给我的方式是public void giveService()和public void nextTable()throws InterruptedException; – bfresh 2012-04-04 14:19:38

+0

更正“在定义中未同步” – bfresh 2012-04-04 14:26:28

+0

对于以对象实例作为锁的同步块,使用同步方法基本上是简短的。您可以在方法中使用同步块,这可以防止多个线程同时访问您的块。否则,他们都会坐在wait()处,并且notify()将随机选择一个等待线程,而不是坐在wait()处的唯一线程。 – 2012-04-04 14:50:13