מחפש בנרות עזרה על Threads ב JAVA

tziporen

New member
מחפש בנרות עזרה על Threads ב JAVA

שאלה לתותחי JAVA.. טוב, אז ככה. הבעיה שיש לי משגעת אותי כבר די הרבה זמן ואני צריך עזרה בדחיפות. הסיפור הוא כזה: יש לי תוכנית שפותחת חלונות (Internal Frame) בתוך חלון אחד ראשי כאשר כל חלון פנימי כזה רץ בthread נפרד. אני צריך לסנכרן בין החלונות כך שלחיצה בחלון אחד תגרום לאחרים להציג מידע מסוים. מה שניסיתי לעשות זה שכל הthreads מבצעים WAIT בתוך פונקצית הRUN וכאשר יש לחיצה בחלון מופעל הLISTENER והוא אמור "להעיר" את כל שאר הthreads. בקיצור, כאשר אני מבצע NOTIFY או NOTIFYALL אני מקבל EXCEPTION שהthread הנוכחי הוא לא הבעלים של המוניטור. אולי מישהו יודע איך עושים את זה? זה אמור להיות פשוט ואני כבר תקוע בנושא המון המון זמן.
 

Pembelton

New member
בשביל לעשות notify על אוביקט

אתה חייב לפני כן, לנעול את האוביקט הזה ע"י synchronize:
 

tziporen

New member
כן, זה כבר נעשה..

אבל הבעיה היא שגם כשאני מבצע notify בתוך הנעילה אני מקבל את הexception. האם זה משנה איזה אובייקט אני נועל? זה חייב להיות אותו אובייקט לכל הthreads? או שזה יכול להיות אוביקט סטטי?
 

Pembelton

New member
אם קבלת את ה exception זה בגלל

שהאוביקט שנעלת לא היה אותו אוביקט שעליו עשית notify תשובה לשאלות: א. כן. זה מאד משנה איזה אוביקט אתה נועל ב. במקרה שלך זה צריך להיות אותו אוביקט לכל ה threads (אם לא תשתמש באוביקט אחד תצטרך לעשות notify על כל אחד בנפרד) ג. זה יכול להיות אוביקט סטטי.
 

tziporen

New member
עדיין לא עובד..

ביצעתי נעילה על אוביקט סטטי. אח"כ כל thread ביצע wait וכנלחץ משהו באחד מהחלונות הוא מבצע interrupt בתוך פונקצית valueChanged וחוזר לפקודה אחרי ה wait. אח"כ כשהוא מנסה לעשות notify (עדיין בתוך הנעילה) נזרק exception... לא ברור למה.
 

Pembelton

New member
ובכן,

סעיף א ======= במתודה run() יש לך wait זה שקול ל- this.wait() שזה אומר שהאוביקט שעליו אתה wait הוא האוביקט this. אבל, מצד שני, את הנעילה אתה לא עושה על this אלא על chosenItem. וזאת הסיבה שאתה מקבל שגיאת זמן ריצה. בשביל לסדר את זה, תכתוב chosenItem.wait() במקום wait() סעיף ב ======= אתה אומר ל thread הראשי ללכת לישון ומעיר אותו באמצעות interrupt. כאשר הוא מתעורר, מה הוא עושה? הוא עושה notifyAll לכל הthreads האחרים. התהליך הזה מיותר וזה מאד יסבך את הפיתוח של התכנית. הרבה יותר פשוט: כאשר אתה מזהה את ה-"אירוע"" של הקליק שעשה המשתמש, תבצע את הפעולות הבאות: א. תנעל את chosenItem ב. תבצע notifyAll על chosenItem
 

tziporen

New member
או קיי...

הבנתי את העניין. אני אבדוק את זה, עזרת לי מאוד, המון תודה!
 
למעלה