2015-11-30 2 views
-5

Сегодня у меня есть школьное задание, чтобы имитировать проблему обеденных философов.Обеденные философы Java

Я просто сделал этот код, чтобы проверить, работает ли он таким простым способом (A). Проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда кто-то, кто не должен есть, начинает все равно есть. Это означает, что, когда принимаются палочки для еды он начинает есть в любом случае ... пожалуйста, дайте мне советы :) Вот код:

import java.util.*; 
public class OperatingSystem implements Runnable { 

    int namn;  // thread name 
    int tal;  // the random number 
    Random rand = new Random(); // implements random 
    boolean chopstick1 = true; 
    boolean chopstick2 = true; 
    boolean chopstick3 = true; 
    boolean chopstick4 = true; 
    boolean chopstick5 = true; 

    public OperatingSystem(int x){  // constructor 
     namn = x; 
     tal = rand.nextInt(30000); 
    } 



    public void think() {  // run method 
    try{ 
     System.out.println(namn + ": " + tal+ " ms"); 
     Thread.sleep(tal); 
     System.out.println(namn + " is done thinking!"); 

    }catch(Exception e){} 

    } 
    public void hungry(){ 

     while(true){ 
     // System.out.println(namn); 
     if(namn == 1){ 
       if((chopstick1==true) && (chopstick2==true)){ 
        chopstick1 = false; 
        chopstick2 = false; 
        break; 
      } 


     } 
     else if(namn == 2){ 
       if((chopstick2==true) && (chopstick3==true)){ 
        chopstick2 = false; 
        chopstick3 = false; 
        break; 
       } 


     } 
     else if(namn == 3){ 
       if((chopstick3==true) && (chopstick4==true)){ 
        chopstick3 = false; 
        chopstick4 = false; 
        break; 
      } 

     } 
     else if(namn == 4){ 
      if((chopstick4==true) && (chopstick5==true)){ 
       chopstick4 = false; 
       chopstick5 = false; 
       break; 


      } 

     } 
     else if(namn == 5){ 
      if((chopstick5==true) && (chopstick1==true)){ 
       chopstick5 = false; 
       chopstick1 = false; 
       break; 
      } 

      } 
     } 


    } 
    public void eat() {  // run method 
     try{ 
      tal = rand.nextInt(30000); 
      System.out.println(namn + " is eating"); 
      Thread.sleep(tal); 
      System.out.println(namn + " is done eating!"); 
     /* chopstick2 = true; 
      chopstick3 = true; 
      chopstick4 = true; 
      chopstick5 = true; 
      chopstick1 = true; 
      */ 
      if(namn == 1){ 
        chopstick1 = true; 
        chopstick2 = true; 
      } 
      else if(namn == 2){ 
        chopstick2 = true; 
        chopstick3 = true; 

       } 


      else if(namn == 3){ 
        chopstick3 = true; 
        chopstick4 = true; 

       } 


      else if(namn == 4){ 
        chopstick4 = true; 
        chopstick5 = true; 

       } 


      else if(namn == 5){ 
        chopstick5 = true; 
        chopstick1 = true; 

       } 


     }catch(Exception e){} 

     } 


    @Override 
    public void run() { 
     think(); 
     hungry(); 
     eat(); 
    } 



} 

///////////////////////////////// here comes the main; 


import java.util.*; 
public class OperatingSystemMain { 

    public static void main(String[] args) { 
     Thread t1 = new Thread(new OperatingSystem(1)); 
     Thread t2 = new Thread(new OperatingSystem(2)); 
     Thread t3 = new Thread(new OperatingSystem(3)); 
     Thread t4 = new Thread(new OperatingSystem(4)); 
     Thread t5 = new Thread(new OperatingSystem(5)); 

     t1.start(); 
     t2.start(); 
     t3.start(); 
     t4.start(); 
     t5.start(); 

    } 

} 
+0

Я бы предположил, что то, что вы называете «простым способом», совсем не просто. Возможно, вы захотите пересмотреть свой подход – Todd

ответ

0

Вы имеете классическую проблему гонки данных. Синхронизация - это ключ.

Например, если namn = 3 и она в настоящее время работает линия

chopstick3 = false; 

ничто не мешает НАМН = 4, чтобы войти в случае, потому что условие ((chopstick4==true) && (chopstick5==true)) верно. (Namn 3 еще не выполнил chopstick4 = false;)

Вы должны синхронизировать acces и модификацию с переменными палочки для еды.