שאלה בג'אבה

  • פותח הנושא BogN
  • פורסם בתאריך

BogN

New member
שאלה בג'אבה

טוב, אז כך אני ממש מתחיל בג'אבה אז... אני לא מבין איך התוכנית הבאה הפלט הוא כך: Created 47 Beginning to finalize after 3436 Chairs have been created Finalizing Chair #47, Setting flag to stop Chair creation All 3436 finalized After all Chairs have been created: total created = 3437, total finalized = 3436 bye! זו התוכנית: class Chair { static boolean gcrun = false; static boolean f = false; static int created = 0; static int finalized = 0; int i; Chair() { i = ++created; if(created == 47) System.out.println("Created 47"); } public void finalize() { if(!gcrun) { // The first time finalize() is called: gcrun = true; System.out.println( "Beginning to finalize after " + created + " Chairs have been created"); } if(i == 47) { System.out.println( "Finalizing Chair #47, " + "Setting flag to stop Chair creation"); f = true; } finalized++; if(finalized >= created) System.out.println( "All " + finalized + " finalized"); } } public class Garbage { public static void main(String[] args) { // As long as the flag hasn't been set, // make Chairs and Strings: while(!Chair.f) { new Chair(); new String("To take up space"); } System.out.println( "After all Chairs have been created:\n" + "total created = " + Chair.created + ", total finalized = " + Chair.finalized); // Optional arguments force garbage // collection & finalization: if(args.length > 0) { if(args[0].equals("gc") || args[0].equals("all")) { System.out.println("gc():"); System.gc(); } if(args[0].equals("finalize") || args[0].equals("all")) { System.out.println("runFinalization():"); System.runFinalization(); } } System.out.println("bye!"); } } ///:~ ועוד משהו אני אמור לתת לתוכנית קלט... איך אני נותן לה??!?!? תודה מראש לעונים
 

ברנדל

New member
כן ,ראיתי, תודה

יפה לך שאתה יודע וזוכר פרטים שכמעט אף תכנת לא. ראיתי את העומק הזה בהמון הודעות שלך. כה לחי!
 

i c e b e r g

New member
--->

קודם כל, חבל שאתה מציג ככה את התוכנית שלך, בצורה הזו היא ממש לא קריאה (תשתמש בלחצנים "תחילת קוד" ו-"סוף קוד" כשאתה שם קוד בפורום. ועכשיו לתשובות: 1. לגבי הפלט, פשוט תעקוב אחרי התכנית. זה מה שהיא מבצעת (יוצרת אובייקטים ואז הורסת אותם). 2. לגבי קלט לתכנית, אם הכוונה היא שהקלט יגיע משורת הפקודה אזי כמו שכתוב בתכנית משתמשים במערך ה- args שפונקציית ה- main מקבלת. כדי להעביר את הפרמטר לתכנית יש לבצע את הפעולה הבאה :
java <program name> <argument 1> <argument 2> ... <argument n>​
דרך נוספת היא בעזרת System.in. (אפשר לעטוף אותו ב- BufferedReader ואז להשתמש ב- readLine() למשל). 3. לגבי השפה, בעברית כותבים את זה ג'אווה ולא ג'אבה.
 

BogN

New member
תודה לך,

אבל בקשר לפלט עדיין לא הבנתי... לפי מה שהבנתי התוכנית יוצרת 47 כיסאות ואז מפסיקה אז איך בשורה השנייה של הפלט רשום שהיא יצרה 3436 כסאות??? וגם מה זה System.gc() System.RunFunalization()l
 

הצלוי

New member
תראה..

כל פעם שרוצים למחוק אובייקט מסוים (כמו כיסא), קודם כל צריך לקרוא למתודה finalize שלו. בג'אווה יש תהליך מיוחד שלא קיים ברוב שפות התכנות שנקרא הGarbage Collector, או בקיצור: gc. התפקיד שלו זה למחוק כל מיני דברים מהזיכרון שכבר לא צריך אותם. למשל אם יצרת 3436 כיסאות שאתה בכלל לא משתמש בהם, הgc יתחיל למחוק לך חלק מהם כדי לפנות לך מקום בזיכרון. System.gc() מבקש מהgc לחפש "זבל" ולפנות אותו. System.RunFinalization() קורא לכל מתודות הfinalize של כל האובייקטים (או כל הכיסאות בתוכנית שלך)- שמישהו יתקן אותי אם אני טועה. זה בקשר לפקודות. בקשר לכיסאות, תראה שהתוכנית יוצרת כיסאות עד שChair.f הוא true, וזה קורה כשהתוכנית _מוחקת_ 47 כיסאות- תראה במתודה Chair.finalize().
 

BogN

New member
ועוד שאלה

אני לא מבין גם את סדר הפלט ההיגיון שלי אומר שהוא ידפיס קודם Beginning to finalize after created + " Chairs have been created ואז פלטים אחרים אם מישהו יכול להסביר לי את סדר הפלט - הכוונה שלי היא למה הפונקציה Funalize נקראת רק לאחר שנוצרו 47 כיסאות ולא ישר תודה
 

הצלוי

New member
הסבר

הפונקציה finalize נקראת לא רק אחרי שנוצרו 47 כיסאות, אלא אחרי שנוצרו 3436 כיסאות. היא נקראת אחרי כל כך הרבה כיסאות ולא ישר כי התהליך שקורא לה (הgc) לא פועל מיידית- הוא פועל כשיש לו משאבים, אין תהליך בעדיפות גבוהה יותר, או כשצריך אותו (בקיצור: "מתי שנוח לו"). כשנוצרים 3436 כיסאות הוא רואה שזה כבר יותר מדי דברים שיושבים על הזיכרון, אז הוא מתחיל למחוק.
 
למעלה