Threards on Java

raffib

New member
Threards on Java

אני צריך עזרה בקשר לנימים ( Threads) אז ככה : לאחר שמפעילים את הנים (Thread) ע"י start והוא סיים את עבודתו, אני רוצה להפעיל אותו שוב ( אני מחזיק Reference אליו) אבל נסיון להפעיל שוב את Start לא עושה כלום הנים לא מופעל שוב ( אני מאתחל את כל משתני המחלקה לפני ביצוע start אבל זה לא עוזר) למישהו יש רעיון ?? תודה מראש
 
אכן כן..יש פתרון

קודם כל האם אתה מכיר את הפונקציות העיקריות? start() stop() suspend() resume() ועוד פונקציות כאלה ואחרות שעוזרות לך לשלוט בתהליכים. אני מבין שאתה מפעיל תהליך עם פונקצית start() ואתה מפסיק אותו אתה צריך לבצע עליו שימוש בפונקצית resume() והשאלה איך אתה מפסיק אותו...בעזרת stop() או בעזרת suspend(). האמת, תהליכים ב JAVA מאוד יעילים קרי ישנה אופציה לטיפול יעיל מאוד בתהליכים. אם תרצה דוגמאת קוד אמור לי בהצלחה
 

raffib

New member
כנראה שלא הבנת אותי עד הסוף

אני לא מפסיק אותו ע"י אחת מהפונקציות : Sleep suspend wait וכד´. אני נותן לו לסיים את ה - run שלו שהופעל ע"י ה- start. תוך כדי שאני מחכה לו עם אם wait. אז אני מבצע מספר חישובים ורוצה להפעיל אותו שוב ע"י ה - start אבל הוא לא מופעל שוב. זאת הבעיה
 

voguemaster

New member
הממ

ברגע שאוביקט THREAD סיים את הריצה שלו הוא גמור, תיצור THREAD חדש.. אם אתה מציב את הרפרנס של החדש, הישן מועמד לאיסוף זייבל אוטומטי
 

raffib

New member
אתה לא צודק

כל עוד אני מחזיק Reference אליו הוא לא גמור ואוסף הזבל האוטומטי לא ינקה אותו (בדוק) אבל הבעיה איך להפעיל אותו שוב (בטוח שיש פתרון לזה מכיוון שזו העיב שאני צריך להגיש כפתרון - והמתרגל אמר שיש לזה פתרון ושנחשוב !?!?!?!)
 

philips

New member
הממ...

אם זכרוני אינו מטעני , THREAD שסיים את ה RUN שלו הוא אכן גמור ולא ניתן להתחילו מחדש.. (כתוב ב SUN JAVA TUTORIAL בפרק של THREADS).. אולי כוונתו הייתה לאיזהשהוא משחק עם יצירת חדשים במקומו אם לשימוש ב SUSPEND או משהו אחר..
 
רפי - אתה טועה

כפי שנאמר ברגע ש THREAD מסיים את תפקידו הוא "מת". אגב לגבי אסיפת זבל האם אתה משתמש ב FINALIZE אן שאתה נותן לקומפיילר לבצע זאת אוטומטית? כי הרי טעות בידי הרוב ש JAVA דואג לניקיון....זה לא ממש כך!
 

raffib

New member
אז ככה.....

קודם כל אני לא טועה. א. שניתכל עוד אני מחזיק Reference ל - thread שהפעלתי אני יכול לגשת לכל אחת מהפונקציות שלו. הדבר היחיד שלא ניתן לעשות לאחר שהוא סיים לעשות את ה - run שלו (ע"י start כמובן) זה לבצע לו שוב start. ב. ה - g.c של java הוא חצי אוטומטי כלומר כל אובייקט שמקבל ערך null ישתחרר בסיבוב הבא שלו ( של ה - g.c ה - gvm מפעיל אותו כל כמה זמן, אני לא יודע בדיוק) ובנוסף כל סיום בלוק ה - g.c משחרר את כל האובייקטים שה - scope שלהם נגמר בסיום הבלוק שנגמר. לגבי שאלתי הראשונה שממנה התחיל כל הסיפור : אז מה שצריך לעשות זה להפעיל ב - run שלו לולאה שתרוץ ושתנאי היציאה שלה היה משתנה שניתן לפנות אלין מחוץ ל - class (כמו פונקציית set) ורק שערכו משתנה הלולאה תסתיים בנוסף להכניס את ה - thread ל- wait בסיום כל איטרציה שהוא עושה בלולאה עד אשר אני רוצה להעיר אותו ואת זה אני העשה ע"י interruot. בצורה זו ה - thread יבצע כל פעם את המשימה שלו ויחכה להוראה ממני לבצע אותה שוב. זהו בעצם ותודה לכל מי שניסה לעזור לי.
 

voguemaster

New member
רעיונות ?

אתה יכול לעשות SUSPEND בכל איטרציה של הלולאה, וכתוב פונקציה שתעיר את ה-THREAD. כלומר פונקציה במחלקה שלך שכשפונים אליה מתבצע RESUME, והיא מוגנת ע"י SYNCHRONIZED. כמובן שזה לא מספיק. כדי לספק תנאי יציאה מספיק משתנה בוליאני (כמובן SYNCHRONIZED) ושיטה שבעזרתה מתודות ממחלקות (או אובייקטים אחרים) יוכלו לפנות אליה. כמובן שהיא גם צריכה להיות SYNCHRONIZED....
 
ויכוח מיותר - אתה טועה לגבי

ה G.C אבל לא משנה...העיקר בהצלחה. ואגב כבר אמרתי שיש פתרון...אבל לך תץקשיב... יאללה יום טוב!
 

philips

New member
הממ...

רפי היקר.. אחד.. הפתרון שהצעת הוא פתרון ידוע וגם מופיע במספר דוגמאות שזכורות לי מספרי JAVA שונים.... אבל מה הקשר בינו לבין מה ששאלת ולתשובות שקיבלת. בפתרון שלך: ה THREAD נמצא במצב "חי" לאורך כל התוכנית - עד שהלולאה הנשלטת תסתיים... ברגע שהיא תסתיים ה THREAD ימות ושום דבר לא יעזור כפי שנכתב לך כאן.. מצורף כאן לינק לאתר של SUN בנושא.. ולגבי שימוש ב SUSPEND או WAIT או בכל פקודה אחרת..הוצעו כאן הצעות כאלו בעבר...
 

voguemaster

New member
אתם מדברים על דברים שונים

הוא אומר שכל עוד יש לו REF לאובייקט ה-THREAD, הוא לא מנוקה מהזיכרון. עד כאן זה נכון. כמובן שבכל מקרה ברגע ש-THREAD סיים את ה-RUN שלו הוא מת ואי אפשר להפעיל אותו שוב. זה עדיין לא מונע מהמתכנת להחזיק את ה-REF של ה-THREAD. צריך להציב במקום המשתנה ערך של THREAD אחר או NULL כדי שה-THREAD יהיה מועמד לניקוי, אחרת האובייקט נשמר (ולמעשה זה בזבוז טוטאלי..). בכל מקרה, אתה טוען שאין ניקוי אוטומטי של המערכת, זה לא נכון. כשאתה מדבר על FINALIZE אנחנו לא מדברים כאן על איסוף המשאבים שתפס ה-THREAD, אלא על עצירת אובייקטי THREAD שעדיין רצים. הדוגמא הכי פשוטה היא כמובן מחלקה שיוצאת מ-SCOPE ויצרה THREAD חדש והוא עדיין רץ. לחלופין אפשר לדבר על APPLET שיצר THREAD שרץ ופתאום הדפדפן נסגר. במקרה זה, אפשר וצריך לעצור אובייקטי THREAD בשיטת ה-FINALIZE כדי להקל על היציאה ושחרור המשאבים. בכל מקרה, איסוף זבל הוא אוטומטי, אלא שאם לא מקפידים על עצירת אובייקטי THREAD זה גורם קצת השהיות ובעיות בסגירה. שום דבר שלא נפתר עם הזמן... בכל מקרה, שים לב שהוא דיבר על איסוף האובייקט ואתה דיברת על עצירה ואיסוף של האובייקט בהשמדה של מחלקה. כל עוד המחלקה שלו לא הושמדה, והוא מחזיק REF, האובייקט עדיין קיים ורק כאשר הוא יעשה לו DEREFERENCE, הוא יהיה מועמד לניקוי. ויכוח עקר.. אלי
 

raffib

New member
לסיכום הדיון

פתרתי ת הבעיה בצורה שאמרתי שאפתור. עכשיו אם לפי הגדרתכם Thread שסיים את ה - run שלו הוא Thread מת אז בסדר. מבחינתי כל עוד אני מחזיק Referenc אליו הוא עדין קיים אבל פשוט פסיבי, כלומר לא ניתן להפעיל אותו אבל ניתן להשתמש בכל שאר השיטות שלו לגבי ה - G.C אני מסכים אם voguemaster לחלוטין !! אז תודה לכולם גם על הלינק שהוספתם לדיון הוא עזר לי מאוד אשמח לפנות אליכם שוב במידה והיו לי בעיות נוספות בנושא. תודה רבה !!
 
למעלה