Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача про обедающих философов, обедают только первые два.. 
:(
    Опции темы
ЛунныйОборотень
Дата 14.4.2013, 21:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 12.11.2006

Репутация: 1
Всего: 1



Здравствуйте!
Пытаюсь решить задачу про обедающих философов 

используя метод монитора.

Но почему то в результате обедают только первые два философа,хотя я вызываю метод 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.

PM MAIL   Вверх
Stolzen
Дата 15.4.2013, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Тут вроде в соседней теме обсуждалась задачка


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
math64
Дата 19.4.2013, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Пока вижу, что номера вилок по месту вычисляются неправильно.
PM   Вверх
Mirkes
Дата 28.4.2013, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



я не анализировал текст детально но кроме ошибки с номерами вилки вижу следующее 
1. Ни один философ не думает в принцепе. Они не философы, они обжоры
2. Я вообще не увидел монитора, который "разрешает философам дейцтвовать" 


--------------------
Mirkes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0749 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.