רק מי שמבין במחלקת Thread בג'אווה
בס"ד
התחלנו ללמוד את מחלקת Thread ואני די מתקשה בזה.
מה שלמשל אני לא מבינה זה מדוע משתמשים במתודת start ולא ישר במתודת run.
יש פה סיכום קצר בנושא באנגלית. אני מבינה אנגלית, מה שאני לא מבינה זה את הסיכום:
"The start() method, executes the run() method of new thread.
The run() method just executes in the current thread, without starting a new thread.
Also calling the run() method on the newly created Thread (Java Thread object) would block the execution of the parent thread till it completes. So that makes the intended parallel processing through two threads ( the new thread and the parent thread) actually serial.
Use start() to have the task run in parallel to the current task, and other tasks.
Don't use a Thread object's run() method. If you want to run the task serially in the current thread then don't use a Thread object at all, instead use a Runnable or any other normal method.
The proper use of Threads and threads is important. And understanding the difference between run() and start() is one of the most basic building blocks. You have to be able to know when things are meant to run in parallel (or 'concurrently') and when they are meant to run serially (or in the same thread)."
נתחיל משני המשפטים הראשונים. הוא אומר משהו כמו ש- start פועלת על thread חדש ו-run פועלת על thread נוכחי. אני לא מבינה את זה, הרי כל אובייקט אני מאתחלת ואז מפעילה עליו את start:
Thread t1 = new Thread("T1");
Thread t2 = new Thread("T2");
System.out.println("begin");
t1.start();
t2.start();
System.out.println("end");
הרי אני לא כותבת סתם start אלא t1.start זה לא אומר שהוא מופעל על ה- thread הנוכחי (הלוא הוא t1)?
שאלה שנייה: כבר קראתי הרבה ועדיין לא הבנתי מדוע את ה- "end" הוא לא מדפיס לי בסוף.
שאלה שלישית: אני מבינה שכל הקטע ב- Thread זה לגרום לפעילות לכאורה "סימולטנית" אבל על פי מה נקבעת הסימולטניות? אם במתודת ה- run שלי אני אומרת לו לישון אז אני מבינה, אבל אם לא - הרי אז לא אמור להתבצע הקוד לפי הסדר? כלומר קודם t1 אחר כך t2 ואחר כך להדפיס לי "end"? ובכלל, הדפסת ה- "end" אינה thread. האם "היריבות על הריצה" לא אמורה להתבצע רק בין פעולות על אובייקטים שהם thread, ופעולות שאינן על אובייקטים שהם thread אמורות להתבצע כרגיל במקום שכתבתי אותן?
שאלה אחרונה: ממה שקראתי הבנתי שלכל thread הקומפיילר מקצה זמן ריצה (בלי קשר לעדיפות שנתתי לו). האם זה אומר שאם במתודת ה- run שלי כתבתי לולאה נורא ארוכה (כמעט אינסופית) אז הקומפיילר יעצור ולא יבצע את כולה וימשיך הלאה?
תודה לעונים ולכל העוסקים במלאכה
בס"ד
התחלנו ללמוד את מחלקת Thread ואני די מתקשה בזה.
מה שלמשל אני לא מבינה זה מדוע משתמשים במתודת start ולא ישר במתודת run.
יש פה סיכום קצר בנושא באנגלית. אני מבינה אנגלית, מה שאני לא מבינה זה את הסיכום:
"The start() method, executes the run() method of new thread.
The run() method just executes in the current thread, without starting a new thread.
Also calling the run() method on the newly created Thread (Java Thread object) would block the execution of the parent thread till it completes. So that makes the intended parallel processing through two threads ( the new thread and the parent thread) actually serial.
Use start() to have the task run in parallel to the current task, and other tasks.
Don't use a Thread object's run() method. If you want to run the task serially in the current thread then don't use a Thread object at all, instead use a Runnable or any other normal method.
The proper use of Threads and threads is important. And understanding the difference between run() and start() is one of the most basic building blocks. You have to be able to know when things are meant to run in parallel (or 'concurrently') and when they are meant to run serially (or in the same thread)."
נתחיל משני המשפטים הראשונים. הוא אומר משהו כמו ש- start פועלת על thread חדש ו-run פועלת על thread נוכחי. אני לא מבינה את זה, הרי כל אובייקט אני מאתחלת ואז מפעילה עליו את start:
Thread t1 = new Thread("T1");
Thread t2 = new Thread("T2");
System.out.println("begin");
t1.start();
t2.start();
System.out.println("end");
הרי אני לא כותבת סתם start אלא t1.start זה לא אומר שהוא מופעל על ה- thread הנוכחי (הלוא הוא t1)?
שאלה שנייה: כבר קראתי הרבה ועדיין לא הבנתי מדוע את ה- "end" הוא לא מדפיס לי בסוף.
שאלה שלישית: אני מבינה שכל הקטע ב- Thread זה לגרום לפעילות לכאורה "סימולטנית" אבל על פי מה נקבעת הסימולטניות? אם במתודת ה- run שלי אני אומרת לו לישון אז אני מבינה, אבל אם לא - הרי אז לא אמור להתבצע הקוד לפי הסדר? כלומר קודם t1 אחר כך t2 ואחר כך להדפיס לי "end"? ובכלל, הדפסת ה- "end" אינה thread. האם "היריבות על הריצה" לא אמורה להתבצע רק בין פעולות על אובייקטים שהם thread, ופעולות שאינן על אובייקטים שהם thread אמורות להתבצע כרגיל במקום שכתבתי אותן?
שאלה אחרונה: ממה שקראתי הבנתי שלכל thread הקומפיילר מקצה זמן ריצה (בלי קשר לעדיפות שנתתי לו). האם זה אומר שאם במתודת ה- run שלי כתבתי לולאה נורא ארוכה (כמעט אינסופית) אז הקומפיילר יעצור ולא יבצע את כולה וימשיך הלאה?
תודה לעונים ולכל העוסקים במלאכה