线程&可卡特和waitNotify

时间:2013-12-24 19:32:58

标签: java multithreading callable thread-synchronization

假设我们有一家雇用了几位厨师的餐厅 我们还有一个收到订单的矢量 那些厨师收到订单并煮熟,直到矢量中的所有订单都被煮熟。

班级 CallableCookWholeOrder 负责烹饪订单。它返回煮熟的。 类 RunnableChef 模拟厨师。它可以接受多个订单,具体取决于压力系数。它接受的每个订单都会发送到 CallableCookWholeOrder 。 “管理”班是向厨师发送命令的一员。

如果没有可用的厨师,应该等到厨师做了一些订单并且压力变量减少了。在这种情况下,厨师会通知管理层。

另一方面,厨师必须等待,如果他现在没有订单或已完成烹饪,直到新订单交付。在这种情况下,他必须得到通知并处理该命令。

  1. 我如何处理等待并通知管理层?我已经尝试创建一个对象并执行obj.wait()但它抛出异常,我不知道问题是什么。我需要管理层等待没有任何一位厨师可以使用。

  2. 我在“RunnableChef”中需要一个Executor,所以我可以提交从“CallableCookWholeOrder”返回的命令,我使用newCachedThreadPool()执行器,因此它将具有动态线程数,因为这个数字与一位厨师不同另一个和他的压力因素。在我的情况下使用这种类型是正确的吗?还有其他建议吗?

  3. 在“RunnableChef”中我有一个传入订单的向量。一旦它被处理,我删除一个订单,以便一个空的向量表明一个厨师应该等待。这是正确的做法吗?

  4. 这些是“RunnableChef”中的方法:

  5. 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)
    

    更多的......

0 个答案:

没有答案