Почему здесь нужно блокировать нить повара? И вообще не очень понятно когда следует блокировать нить (объект this в блоке синхронизации это же мьютекс нити?)?
synchronized (this) {
                    needToWait = !needToCookOrders();
                    if (!needToWait) {
                        cooking();
                    }
                }