Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Dining Philophers konusunda bir takım yanlışlıklar


Öne çıkan mesajlar

Mesaj tarihi:
Merhaba arkadaşlar, Ben elimden geldiğince bir GUI oluşturup javada semaphore classını kullanarak bu problemi implemente etmeye çalıştım, fakat java.lang.ArrayIndexOutOfBoundsException: 5 ve java.lang.NullPointerException şeklinde hatalar almaktayım

İlgili kod

public class Philosopher implements Runnable {


private static Table table;
private int ID;
private int N = 4;
private static Semaphore s1 = new Semaphore(5) ;
private static Semaphore[] sarray = new Semaphore[5];
private int[] array = new int[6];
private int thinking = 0;
private int hungry = 1;
private int eating = 2;
private int left = (ID + N - 1) % N;
private int right = (ID + 1) % N;

void test(int i)
{
if((array[i] == hungry) && (array[left] != eating) && (array[right] != eating))
{
table.ForkTake_GUI(i);
array[i] = eating;
sarray[i].release();

}
}

void take_forks(int i)
{
try {
s1.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
array[i] = hungry;
table.Hungry_GUI(i);
test(i);

table.Eating_GUI(i);
try {
s1.release();
sarray[i].acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}

void put_forks(int i)
{
table.StopEating_GUI(i);
try {
s1.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
array[i] = thinking;
test(left);
test(right);
table.ForkPut_GUI(i);
s1.release();

}

public Philosopher(int i)
{
setID(i);
}

public void run()
{
while(true)
{
Random RandomGenerator = new Random();
int randomNum = RandomGenerator.nextInt(10);
try {
Thread.sleep((randomNum * 1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


take_forks(ID);

put_forks(ID);
}

}

public static void main(String args[]) {

EventQueue.invokeLater(new Runnable() {
public void run() {
try {
table = new Table();
table.frame.setVisible(true);
}
catch(Exception e){
e.printStackTrace();
}

}
});

Philosopher p1 = new Philosopher(1);
Philosopher p2 = new Philosopher(2);
Philosopher p3 = new Philosopher(3);
Philosopher p4 = new Philosopher(4);
Philosopher p5 = new Philosopher(5);
Thread pt1 = new Thread(p1);
Thread pt2 = new Thread(p2);
Thread pt3 = new Thread(p3);
Thread pt4 = new Thread(p4);
Thread pt5 = new Thread(p5);


sarray[0] = new Semaphore(1);
sarray[1] = new Semaphore(1);
sarray[2] = new Semaphore(1);
sarray[3] = new Semaphore(1);
sarray[4] = new Semaphore(1);

pt1.start();
pt2.start();
pt3.start();
pt4.start();
pt5.start();

}
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}

}


Var mıdır fikri olan?
Mesaj tarihi:
Gordum galiba.

247. satirda 5 boyutlu array aciosun. Sonra philosopher'larin ID'leri 1...5 olarak atiyorsun. O yuzden take_fork ve put_fork fonksiyonlarini id'si 5 olan philosopher cagirinca patliyor kodun.
Mesaj tarihi:
Tekrardan kusura bakmayasınız, çözdüm diye geri bakmamışım buraya =), yalnız bu sefer de 275 ve 330. satırlarda java.lang.NullPointerException hatası alıyorum nedendir acaba sizce?
Mesaj tarihi:
yorumlari okumadim muhtemelen biri yazmistir hatta koda da bakmadim ama hatalara bakinca direk bir arrayin sinirlarini astigini soyleyebilirim. indexlerini kontrol etmen lazim
Mesaj tarihi:
muhtemelen bi arrayin sınırından taştın felan,

take_forks(ID);

bunun götürdüğü

table.Hungry_GUI(i);

burda, hungry_guinin içinde

plates[i].setIcon(new ImageIcon(ImageIO.read(new File("spaghetti_yellow.jpg"))));

böle bi array var.

take forkstaki ID, plates in içine "i" diye giriyor.
ID nin nerde set edildiğini bulamadım,
run diye bir methodun var onu nerde invoke ediosun onu da bulamadım ama sıkıntı muhtemelen ID nin sayısının 4 ten büyük olması. plates sonuçta 5 size lı bi array.
Mesaj tarihi:
Thsn. said:

Tekrardan kusura bakmayasınız, çözdüm diye geri bakmamışım buraya =), yalnız bu sefer de 275 ve 330. satırlarda java.lang.NullPointerException hatası alıyorum nedendir acaba sizce?


Eventqueue da schedule edilen Runnable icin de new Table () demissin. Eger ki duzeltme yaptiktan sonra line number larin kaymadiysa, table in null. Eventqueue baska thread de is yapiyorsa, Race condition var.
×
×
  • Yeni Oluştur...