לפני הצגת ה מושג חוט , לא הצלחנו להריץ יותר ממשימה אחת במקביל. זה היה חסרון, וכדי להסיר את החיסרון הזה, קונספט חוט הוצג.
א פְּתִיל הוא תהליך קל מאוד, או שאנו יכולים לומר החלק הקטן ביותר של התהליך המאפשר לתוכנית לפעול בצורה יעילה יותר על ידי הפעלת משימות מרובות בו זמנית.
משהו מהיר
על מנת לבצע משימות מסובכות ברקע, השתמשנו ב- מושג שרשור בג'אווה . כל המשימות מבוצעות מבלי להשפיע על התוכנית הראשית. בתוכנית או בתהליך, לכל השרשורים יש נתיב נפרד משלהם לביצוע, כך שכל שרשור של תהליך הוא עצמאי.
יתרון נוסף בשימוש פְּתִיל הוא שאם שרשור מקבל חריג או שגיאה בזמן ביצועו, זה לא משפיע על ביצוע השרשורים האחרים. כל השרשורים חולקים זיכרון משותף ויש להם מחסנית משלהם, משתנים מקומיים ומונה תוכניות. כאשר מספר שרשורים מבוצעים במקביל בו זמנית, תהליך זה ידוע בשם ריבוי השחלות .
בצורה פשוטה, שרשור הוא:
- תכונה שבאמצעותה נוכל לבצע מספר פעילויות בתוך תהליך אחד.
- תהליך קל משקל.
- סדרה של הצהרות שבוצעו.
- רצף מקונן של קריאות שיטה.
דגם חוט
בדיוק כמו תהליך, חוט קיים בכמה מדינות. מדינות אלה הן כדלקמן:
1) חדש (מוכן להפעלה)
חוט נכנס חָדָשׁ כאשר הוא מקבל זמן CPU.
2) ריצה
חוט נכנס ריצה לציין מתי זה בביצוע.
3) מושעה
חוט נמצא ב מוּשׁהֶה לציין כאשר הוא אינו פעיל באופן זמני או בביצוע.
4) חסום
חוט נמצא ב חָסוּם לציין כאשר הוא ממתין למשאבים.
5) הסתיים
שרשור מגיע במצב זה כאשר בכל זמן נתון הוא עוצר את ביצועו באופן מיידי.
יצירת שרשור
שרשור נוצר על ידי 'יצירה או יישום' של ממשק בר הפעלה או על ידי הארכת שיעור חוטים . אלו הן שתי הדרכים היחידות שבאמצעותן נוכל ליצור חוט.
אובייקט java ל-json
בואו נצלול לפרטים על שתי הדרכים הללו ליצירת שרשור:
שיעור חוטים
א שיעור חוטים יש מספר שיטות ובנאים המאפשרים לנו לבצע פעולות שונות על חוט. כיתת Thread מרחיבה את לְהִתְנַגֵד מעמד. ה לְהִתְנַגֵד הכיתה מיישמת את ניתן להרצה מִמְשָׁק. למחלקת ה-thread יש את הבנאים הבאים המשמשים לביצוע פעולות שונות.
ממשק בר הפעלה (שיטת run()
ממשק Runnable נדרש להיות מיושם על ידי אותה מחלקה שהמופעים שלה מיועדים להתבצע על ידי שרשור. הממשק הניתן להפעלה נותן לנו את לָרוּץ() שיטה לביצוע פעולה עבור השרשור.
שיטת start()
השיטה משמשת לפתיחת שרשור שיצרנו לאחרונה. זה מתחיל שרשור חדש עם ערימת שיחות חדשה. לאחר ביצוע ה הַתחָלָה() השיטה, השרשור משנה את המצב מ-New ל-Rnnable. זה מבצע את שיטת run() כאשר השרשור מקבל את הזמן הנכון לביצועו.
בואו ניקח דוגמה כדי להבין איך אנחנו יכולים ליצור א Java שרשור על ידי הרחבת מחלקת Thread:
ThreadExample1.java
// Implementing runnable interface by extending Thread class public class ThreadExample1 extends Thread { // run() method to perform action for thread. public void run() { int a= 10; int b=12; int result = a+b; System.out.println('Thread started running..'); System.out.println('Sum of two numbers is: '+ result); } public static void main( String args[] ) { // Creating instance of the class extend Thread class ThreadExample1 t1 = new ThreadExample1(); //calling start method to execute the run() method of the Thread class t1.start(); } }
תְפוּקָה:
יצירת שרשור על ידי הטמעת הממשק הניתן להרצה
ב-Java, אנו יכולים גם ליצור שרשור על ידי הטמעת הממשק הניתן להרצה. הממשק הניתן להרצה מספק לנו גם את שיטת run() וגם את שיטת start().
תורת העצים והגרפים
ניקח דוגמה כדי להבין כיצד אנו יכולים ליצור, להתחיל ולהפעיל את השרשור באמצעות הממשק הניתן להרצה.
ThreadExample2.java
class NewThread implements Runnable { String name; Thread thread; NewThread (String name){ this.name = name; thread = new Thread(this, name); System.out.println( 'A New thread: ' + thread+ 'is created ' ); thread.start(); } public void run() { try { for(int j = 5; j > 0; j--) { System.out.println(name + ': ' + j); Thread.sleep(1000); } }catch (InterruptedException e) { System.out.println(name + ' thread Interrupted'); } System.out.println(name + ' thread exiting.'); } } class ThreadExample2 { public static void main(String args[]) { new NewThread('1st'); new NewThread('2nd'); new NewThread('3rd'); try { Thread.sleep(8000); } catch (InterruptedException excetion) { System.out.println('Inturruption occurs in Main Thread'); } System.out.println('We are exiting from Main Thread'); } }
תְפוּקָה:
בדוגמה לעיל, אנו מבצעים את Multithreading על ידי הטמעת הממשק הניתן להרצה. למידע נוסף על Multithreading, לחץ כאן .