我有3节课。一个服务员(线程),一个表(线程)和一个队列(不是一个线程)(在先出队列中先进行simiple)。
最初创建几个服务员,然后创建表。除了服务员之外还有很多桌子,所以桌子必须“等待”服务员为他们服务。我应该使用“java同步原语,等待通知和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 :(得分:1)
这与使用wait(),notify()和notifyAll()的教程一样好。首先阅读它,看看你是否有其他问题要么SO还没有回答,要么特别针对你的问题。