Здравствуйте! Пытаюсь решить задачу про обедающих философов используя метод монитора. Но почему то в результате обедают только первые два философа,хотя я вызываю метод notify() Подскажите пожалуйста ,в чем моя ошибка? Главный класс.Тут я вызываю потоки и создаю массив вилок,которыми пользуются философы. Код | package programm;
public class Programm {
public static boolean[] chopstick;//=new boolean[5];
public static void main(String[] args) throws InterruptedException { // TODO code application logic here chopstick = new boolean[5]; for (int i = 0; i < chopstick.length; i++) {
chopstick[i] = true;
} Philosopher phil1=new Philosopher("Philosopher 1", 1); Philosopher phil2=new Philosopher("Philosopher 2", 2); Philosopher phil3=new Philosopher("Philosopher 3", 3); Philosopher phil4=new Philosopher("Philosopher 4", 4); Philosopher phil5=new Philosopher("Philosopher 5", 5); System.out.println(Thread.activeCount()); // phil1.t.join(); // phil2.t.join(); // phil3.t.join(); // phil4.t.join(); // phil5.t.join(); } }
|
Класс Философ Код | /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package programm;
import java.util.logging.Level; import java.util.logging.Logger; import programm.Programm;
public class Philosopher implements Runnable {
String name; Thread t; int seatNumber;
public Philosopher(String threadname, int seatNumber) { name = threadname; this.seatNumber = seatNumber; t = new Thread(this, name); // System.out.println("Philosopher " + name + t); t.start(); }
public int getChopstickLeftFromNumber(int seatNumber) { if (seatNumber == 0) { return 5; } else { return (seatNumber - 1); } }
public int getChopstickRightFromNumber(int seatNumber) {
if (seatNumber == 5) { return 0; } else { return (seatNumber + 1); } }
synchronized public void eat() throws InterruptedException { int leftChopstick, rightChopstick; leftChopstick = getChopstickLeftFromNumber(this.seatNumber); rightChopstick = getChopstickRightFromNumber(this.seatNumber); while ((Programm.chopstick[leftChopstick] == true) && (Programm.chopstick[rightChopstick] == true)) { Programm.chopstick[leftChopstick] = false; Programm.chopstick[rightChopstick] = false; System.out.println("Philosopher" + seatNumber + " picks up left chopstick."); System.out.println("Philosopher" + seatNumber + " picks up right chopstick."); Thread.sleep(seatNumber * 1000); System.out.println("Philosopher" + seatNumber + " eats."); Programm.chopstick[leftChopstick] = true; Programm.chopstick[rightChopstick] = true; System.out.println("Philosopher" + seatNumber + " picks down left chopstick."); System.out.println("Philosopher" + seatNumber + " picks down right chopstick."); notify(); } //else { System.out.println("Philosopher"+seatNumber+"waits"); wait(); //} }
public void think() { }
@Override public void run() {
try { // for(int i=0;i<5;i++) // { eat(); // } } catch (InterruptedException ex) { Logger.getLogger(Philosopher.class.getName()).log(Level.SEVERE, null, ex); }
} }
|
Результат получается примерно вот такой: Код | Philosopher1 picks up left chopstick. Philosopher1 picks up right chopstick.
Philosopher3waits
Philosopher2 picks up left chopstick. Philosopher2 picks up right chopstick.
Philosopher5waits Philosopher4waits
Philosopher1 eats. Philosopher1 picks down left chopstick. Philosopher1 picks down right chopstick.
Philosopher1 picks up left chopstick. Philosopher1 picks up right chopstick.
Philosopher2 eats. Philosopher2 picks down left chopstick. Philosopher2 picks down right chopstick.
Philosopher2 picks up left chopstick. Philosopher2 picks up right chopstick.
Philosopher1 eats. Philosopher1 picks down left chopstick. Philosopher1 picks down right chopstick.
Philosopher1 picks up left chopstick. Philosopher1 picks up right chopstick. Philosopher1 eats.
Philosopher1 picks down left chopstick. Philosopher1 picks down right chopstick. Philosopher1 picks up left chopstick. Philosopher1 picks up right chopstick. Philosopher2 eats. Philosopher2 picks down left chopstick. Philosopher2 picks down right chopstick. Philosopher2 picks up left chopstick. Philosopher2 picks up right chopstick. Philosopher1 eats. Philosopher1 picks down left chopstick. Philosopher1 picks down right chopstick. Philosopher1 picks up left chopstick. Philosopher1 picks up right chopstick. Philosopher1 eats. Philosopher1 picks down left chopstick. Philosopher1 picks down right chopstick. Philosopher1 picks up left chopstick. Philosopher1 picks up right chopstick. Philosopher2 eats. Philosopher2 picks down left chopstick. Philosopher2 picks down right chopstick. Philosopher2 picks up left chopstick. Philosopher2 picks up right chopstick. Philosopher1 eats. Philosopher1 picks down left chopstick. Philosopher1 picks down right chopstick. Philosopher1 picks up left chopstick. Philosopher1 picks up right chopstick.
|
|