Я делаю сценарий шеф-повара, хлеба и клиента в Java с потоком. Так что в основном шеф-повар делает хлеб, клиент ест его, шеф-повар делает больше. Максимум - 20. Шеф-повар прекращает готовить хлеб, когда им 20. Клиент перестает есть, когда его нет. Но каждый раз, когда я использую notifyall, он ждет четыре секунды, прежде чем клиент съест его (предположительно, чтобы сделать еще 3 хлеба). Вот код для запуска в классе Chef (реализует Runnable)wait and notifyall ждет другой темы
public void run(){
int id = 0;
while(true){
if(Basket.breadList.size() == 20){
synchronized(Basket.breadList){
try {
Basket.breadList.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Bread bread = new Bread(id);
System.out.println("Bread " + id + " had just been made. ");
synchronized(Basket.breadList){
Basket.breadList.notifyAll();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
id++;
}
}
}
Вот код для Клиента:
public void run(){
int id;
while(true){
if(Basket.breadList.size() == 0){
synchronized(Basket.breadList){
try {
Basket.breadList.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
id = Basket.breadList.get(Basket.breadList.size()-1).id;
Basket.breadList.remove(Basket.breadList.size()-1);
System.out.println("Bread " + id + " had just been eaten. ");
synchronized(Basket.breadList){
Basket.breadList.notifyAll();
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Вот код в контроллере:
public static void main(String[] args) {
Chef chef = new Chef();
Customer customer = new Customer();
Thread t1 = new Thread(chef);
Thread t2 = new Thread(customer);
t1.start();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
}
Basket.breadList - это просто архарист из хлеба.
помогите пожалуйста. Очень признателен!
Почему вы не используете параллельный пакет, добавленный в Java 5? 'BlockingQueue' был сделан для такого рода случаев использования производителем-потребителем – dkatzel
Почему у вас есть спит? И почему вы проверяете общие данные (например, 'Basket.breadList.size') вне блоков' synchronized'? –
@dkatzel: я предполагал, что это домашнее задание - отсюда мой смутный ответ. И я полностью поддерживаю обучение использованию 'synchronzed' перед переходом к параллельным библиотекам. Конечно, больше не нужно синхронизировать блоки в производстве, это должно быть чем-то очень необычным, чтобы гарантировать его использование вместо java.util.concurrent. –