我有3节课。一个 Waiter(线程)、一个 Table(线程)和一个 Queue(不是线程)(简单的先进先出队列)。
最初创建了几个服务员,然后创建了表。桌子比服务员多得多,所以桌子必须“等待”服务员为他们服务。我应该使用“java 同步原语、等待通知和通知”来解决这个问题。以下是每个班级的指南:
表:当它启动时,它进入队列,然后调用一个内部方法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 中是如何工作的。任何帮助,将不胜感激。