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


Thsn.

Öne çıkan mesajlar

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?
Link to comment
Sosyal ağlarda paylaş

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.
Link to comment
Sosyal ağlarda paylaş

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.
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...