假设我们有一家雇用了几位厨师的餐厅
我们还有一个收到订单的矢量
那些厨师收到订单并煮熟,直到矢量中的所有订单都被煮熟。
班级 CallableCookWholeOrder 负责烹饪订单。它返回煮熟的。 类 RunnableChef 模拟厨师。它可以接受多个订单,具体取决于压力系数。它接受的每个订单都会发送到 CallableCookWholeOrder 。 “管理”班是向厨师发送命令的一员。
如果没有可用的厨师,应该等到厨师做了一些订单并且压力变量减少了。在这种情况下,厨师会通知管理层。
另一方面,厨师必须等待,如果他现在没有订单或已完成烹饪,直到新订单交付。在这种情况下,他必须得到通知并处理该命令。
我如何处理等待并通知管理层?我已经尝试创建一个对象并执行obj.wait()但它抛出异常,我不知道问题是什么。我需要管理层等待没有任何一位厨师可以使用。
我在“RunnableChef”中需要一个Executor,所以我可以提交从“CallableCookWholeOrder”返回的命令,我使用newCachedThreadPool()执行器,因此它将具有动态线程数,因为这个数字与一位厨师不同另一个和他的压力因素。在我的情况下使用这种类型是正确的吗?还有其他建议吗?
在“RunnableChef”中我有一个传入订单的向量。一旦它被处理,我删除一个订单,以便一个空的向量表明一个厨师应该等待。这是正确的做法吗?
这些是“RunnableChef”中的方法:
public synchronized Boolean canAcceptTask(Order order){
if(...) return true;
return false;
}
public synchronized void accept(Order order){
this.pressure = this.pressure+order.getDifficulty();
orders.add(order);
this.notifyAll();
}
public void run() {
this.takeOrder();
e.shutdown();
}
private synchronized void takeOrder(){
while(orders.isEmpty()){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(Order order:orders) {
Future<Order> cooked = e.submit(new CallableCookWholeOrder(order));
allCooked.add(cooked);
this.pressure = this.pressure - order.getDifficulty();
orders.removeElement(i);
this.check.update(); //notifies the management
}
}
我在提交行和takeOrder行上遇到例外。
Exception in thread "pool-4-thread-4" java.util.concurrent.RejectedExecutionException:
Task java.util.concurrent.FutureTask@50a5314 rejected from java.util.concurrent.ThreadPoolExecutor@24065c4[Shutting down, pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.reject(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.execute(Unknown Source)
at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
at RunnableChef.takeOrder(RunnableChef.java:73)
at RunnableChef.run(RunnableChef.java:50)
更多的......