Java 线程、可调用项和waitNotify

Java 线程、可调用项和waitNotify,java,multithreading,callable,thread-synchronization,Java,Multithreading,Callable,Thread Synchronization,假设我们有一家餐馆雇佣了几个厨师。 我们还有一个输入订单的向量。 这些厨师接收订单并烹饪,直到向量中的所有订单都烹饪完毕 CallableCookWholeOrder类负责制作订单。它返回煮熟的那个。 RunnableChef类模拟厨师。根据压力系数,它可以接受多个订单。它接受的每个订单都会发送给CallableCookWholeOrder。 班级管理是向厨师发送订单的管理 如果没有可用的厨师,则应等待厨师完成某些订单并降低其压力变量。在这种情况下,厨师长会通知管理层 另一方面,厨师必须等待,如

假设我们有一家餐馆雇佣了几个厨师。 我们还有一个输入订单的向量。 这些厨师接收订单并烹饪,直到向量中的所有订单都烹饪完毕

CallableCookWholeOrder类负责制作订单。它返回煮熟的那个。 RunnableChef类模拟厨师。根据压力系数,它可以接受多个订单。它接受的每个订单都会发送给CallableCookWholeOrder。 班级管理是向厨师发送订单的管理

如果没有可用的厨师,则应等待厨师完成某些订单并降低其压力变量。在这种情况下,厨师长会通知管理层

另一方面,厨师必须等待,如果他目前没有收到订单,或者已经完成了他所做的,直到一个新的订单交付。在这种情况下,必须通知他并处理该订单

我如何处理管理层中的等待和通知?我尝试创建一个对象并执行obj.wait,但它抛出异常,我不知道问题出在哪里。我需要管理层等待,以防没有厨师

我需要一个RunnableChef中的执行器,这样我就可以提交从CallableCookWholeOrder返回的订单。我使用newCachedThreadPool执行器,这样它将有一个动态的线程数,因为每个厨师的线程数和他的压力系数不同。在我的情况下使用这种类型正确吗?还有其他建议吗

在RunnableChef中,我有一个传入订单的向量。我删除一个订单,一旦它被处理好,这样一个空向量表示厨师应该等待。这样做对吗

以下是RunnableChef中的方法:

公共同步布尔值canAcceptTaskOrder顺序{ 如果…返回true; 返回false; } 公共同步无效接受订单{ this.pressure=this.pressure+order.getDestion; orders.addorder; 这是我的全部; } 公开募捐{ 这是takeOrder; e、 关闭; } 专用同步无效接收订单{ 我是空的{ 试一试{ 这个,等等; }捕捉中断异常e{ e、 打印跟踪; } } 订单:订单{ Future cooked=e.submitnew callablecookwholeorder; 全熟的,全熟的; this.pressure=this.pressure-order.getDestion; orders.removeElementi; this.check.update;//通知管理层 } } 我在提交行和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)

更重要的是…

如果您发布这些异常,那就太好了。根据stacktrace executorService,当您尝试提交新的可调用时,它将关闭,所以应该抛出异常。我不明白为什么它们会关闭,因为在某个地方executorService.shutdown executed:检查Manager类中的代码,在执行RunnableChef.run之后,您尝试再次调用它,但是e.shutdown;已被调用,因此将引发此异常。要解决此问题,只需删除关闭,因为如果使用newCachedThreadPool创建executorService,则池中的线程将在60秒后自动终止。