ورود

View Full Version : مشکل در Thread ها



م.امید
پنج شنبه 30 آبان 1392, 11:38 صبح
با سلام.من برنامه ای نوشته ام که قرار است در آن دو thread به عنوان تولید کننده و مصرف کننده اجرا شوند و یک صف حلقوی که یک آرایه است با طول 5.تولید کننده باید مقدار تصادفی بین صفر تا صد را تولید و در صف قرار دهد.مصرف کننده هم باید از صف مصرف کند.اما برنامه درست کار نمی کند و خروجی های اشتباه می دهد.لطفا در صورت یافتن مشکل راهنمایی کنید.

public class Main {

public static final int BUFFER_SIZE = 5;
public static Integer[] buffer = new Integer[BUFFER_SIZE];

public static int rear = BUFFER_SIZE - 1;
public static int front = BUFFER_SIZE - 1;



public static void main(String[] args) throws InterruptedException {
Consumer c = new Consumer();
c.start();
Producer p = new Producer();
p.start();

}

}



class Consumer extends Thread {

@Override
public void run() {
while (true) {

synchronized (Main.buffer) {
if (Main.front == Main.rear) {
System.out.println("queue is empty");

}
else {

Main.front = (++Main.front % Main.BUFFER_SIZE);

System.out.println("Consumer state: " + "RUNNING and consume:" + Main.buffer[Main.front]);
}
}

/*try {

}
catch (Exception e) {

e.printStackTrace();
}*/

}

}

}



class Producer extends Thread {

Random randomGenerator = new Random();



@Override
public void run() {
while (true) {
synchronized (Main.buffer) {

if (Main.front == (++Main.rear % Main.BUFFER_SIZE)) {
System.out.println("full");

}
else {

Main.rear = (++Main.rear % Main.BUFFER_SIZE);
Main.buffer[Main.rear] = randomGenerator.nextInt(100);
//Main.in = ++Main.in % 5;
System.out.println("Producer state: " + "RUNNING and produce:" + Main.buffer[Main.rear]);
}
}

/*try {

}
catch (InterruptedException e) {
e.printStackTrace();
}*/
}
}

}

cups_of_java
پنج شنبه 30 آبان 1392, 12:12 عصر
چشمی نمی شه اینو فهمید... سعی کن روی 10 تا عدد اجراش کنی... چه خروجی ای میده؟ کجاش اشتباهه؟
احتمالن از آرایه حلقویت باشه. مطمنی درست نوشتیش؟

م.امید
پنج شنبه 30 آبان 1392, 12:26 عصر
خروجی ازش گرفتم و از خروجی ها معلومه اشتباه هست.مثلا تولید کننده پشت سر هم بیستا عدد تولید می کنه و اصلا پیغام پر شده نمیده.شاید مشکل از صف حلقوی باشه اما من دستی trace کردم درست بود و شرایط پر و خالی بودن هم درست هستش.فکر کنم متغیرها مقدارشان عوض می شود.منظورم اینست که شاید مشکل از ()synchronized باشه.اما هر تغییری دادم درست نشد.لطفا اگه براتون مقدروره یک اجرا ازش بگیرید.شاید شما مشکل رو پیدا کردید.من پنج شش ساعته دارم دنبال مشکل می گردم.

Ehsan rashydy
پنج شنبه 30 آبان 1392, 14:54 عصر
یه مشکلی که به چشمم خورد این بود که شما تو کلاس Producer موقعی که داری پر بودن صف رو بررسی میکنی(خط69)Main.rear رو یکی زیاد میکنی از طرفی همین کار رو تو خط75 هم داری انجام میدی،
این باعث میشه که تو هربار اجرای حلقه ی بیرونی(while)،
Main.rear حداقل 1بار و حداکثر 2 بار، یدونه زیاد بشه(عملا یه جاهایی اشتباهی داره یدونه زیاد میشه)، فک کنم مشکل همین جا باشه!

م.امید
پنج شنبه 30 آبان 1392, 15:05 عصر
سلام.آقا دستت درد نکنه جوابت کارگشا بود.مشکل حل شد.امیدوارم بتونم جبران کنم.بازم ممنون