JavaRush /בלוג Java /Random-HE /ריבוי השרשורים ב-Java

ריבוי השרשורים ב-Java

פורסם בקבוצה

מבוא

לפני שנלמד על שרשורי Java, בואו נסתכל על העתיד הקרוב. תאר לעצמך ששלחת את קורות החיים שלך ועברת ראיון. אתה וכמה עשרות עמיתים לעתיד הוזמנתם לעבוד בחברת תוכנה גדולה. בין יתר הטרדות, אתה צריך להגיש מסמכי נייר להעסקה לעובד משאבי אנוש עייף.
ריבוי השרשורים ב-Java - 1
כדי לזרז את התהליך, ניתן לחלק את המועמדים לתפקיד לשתי קבוצות ולחלק אותם בין שני מנהלי משאבי אנוש (במידה ויש כאלה בחברה). כתוצאה מכך, אנו מאיצים את התהליך עקב עבודת תכנון מקבילה .
ריבוי השרשורים ב-Java - 2
אם יש רק קצין כוח אדם אחד בחברה, אז תצטרך איכשהו לצאת. לדוגמה, אתה יכול שוב לחלק את כולם לשתי קבוצות, למשל, לראיין בנות ובנים בתורו.
ריבוי השרשורים בג'אווה - 3
או לפי עיקרון אחר: מכיוון שיש יותר אנשים בקבוצה הנמוכה, נחליף שתי בנות לילד אחד.
ריבוי השרשורים בג'אווה - 4
דרך זו של ארגון העבודה נקראת ריבוי חוטים . קצין משאבי אנוש העייף שלנו עובר לקבוצות שונות כדי לגייס מהן את העובד הבא. יש אולי אחת עשרה קבוצות, וארבעה קציני כוח אדם. במקרה זה, עיבוד ריבוי השרשורים יתרחש במקביל על ידי מספר אנשי משאבי אנוש, שיכולים לקחת את האדם הבא מכל קבוצה שיעבד את המסמכים שלו.

תהליכים

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

זרמים

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

מצבי זרימה

כל שרשור נמצא באחד מהמצבים הבאים:
  • נוצר ( New) – התור לקצין משאבי האנוש מתכונן, אנשים מתארגנים.
  • הושק ( Runnable) - התור שלנו הסתדר עבור קצין משאבי האנוש והוא נמצא בעיבוד.
  • חסום ( Blocked) – הבחור האחרון בתור מנסה לצעוק שם, אבל כששמע שהבחורה בקבוצה הבאה התחילה לעשות את זה לפניו, הוא השתתק.
  • הושלם ( Terminated) - כל התור הושלם על ידי קצין משאבי אנוש ואין צורך בכך.
  • Waiting( Waiting) - תור אחד ממתין לאות מאחר.
ארגון החוטים והאינטראקציה ביניהם הוא הבסיס לפעולה יעילה של תהליכים.

בואו נחזור לעולם ה-IT

במאה ה-21, ביצוע מרובה חוטים ומקביל הפך לרלוונטי. מאז שנות ה-90 של המאה הקודמת, מערכות הפעלה ריבוי משימות Windows, MacOS ו-Linux התבססו היטב במחשבים ביתיים. לעתים קרובות אתה יכול למצוא בהם ארבעה או יותר מעבדי ליבה. מספר הבלוקים המקבילים של כרטיסי מסך GPU כבר עלה על אלף. תוכניות פופולריות נכתבות תוך התחשבות ב-multithreading (multithreading), למשל, גרסאות מודרניות של תוכנות לעיבוד גרפיקה, וידאו או הפעלה עם כמויות גדולות של נתונים: Adobe Photoshop, WinRar, Mathematica, משחקים מודרניים. ריבוי הליכי ג'אווה הוא נושא חשוב מאוד, פופולרי ומורכב. לכן, בקורס JavaRush יש הרבה משימות כדי להבין אותו היטב. דוגמאות של ג'אווה על ריבוי שרשורים יעזרו לך לשלוט בניואנסים ובדקויות הבסיסיות של אזור זה, ולסנכרן את עבודת השרשורים.

תהליך

תהליך הוא מופע פועל של תוכנית שמערכת ההפעלה (OS) הקצתה לה זיכרון, זמן מעבד/ליבות ומשאבים אחרים. חשוב שהזיכרון יוקצה בנפרד; מרחבי הכתובות של תהליכים שונים אינם נגישים זה לזה. אם תהליכים צריכים לתקשר, הם יכולים לעשות זאת באמצעות קבצים, צינורות ושיטות תקשורת בין-תהליכיות אחרות.

זְרִימָה

Java Thread(זרם). לפעמים, כדי למנוע בלבול עם מחלקות Java אחרות Streamוכדומה, שרשורי Java מתורגמים לעתים קרובות כ-thread. הם משתמשים במשאבים שהוקצו לתהליך והם הדרך בה התהליך מבוצע. השרשור הראשי מבצע את השיטה mainויוצא. כאשר תהליך מבוצע, ניתן להוליד שרשורים נוספים (שרשורי ילדים). חוטים של אותו תהליך יכולים להחליף נתונים זה עם זה. ג'אווה multithreading דורשת לקחת בחשבון סנכרון נתונים, אל תשכח מזה. ב-Java, תהליך מסתיים כאשר השרשור האחרון שלו מסתיים. עבור משימות רקע, ניתן להתחיל שרשור בתור דמון ( daemon), ההבדל ממשימות רגילות הוא שהם יסתיימו בכוח כאשר כל daemonהשרשורים שאינם של התהליך יסתיימו.

אפליקציה מרובת חוטים ראשונה

יש יותר מחצי תריסר דרכים ליצור שרשורים; בקורס JavaRush נבחן אותם בפירוט. ראשית, בואו נכיר את אחד הבסיסיים שבהם. יש מחלקה מיוחדת Threadבשיטה run()שלה אתה צריך לכתוב קוד שמיישם את ההיגיון של התוכנית. לאחר יצירת שרשור, תוכל להתחיל אותו על ידי קריאה ל- start(). בואו נכתוב תוכנית הדגמה המיישמת דוגמה לריבוי הליכי ג'אווה.
class PeopleQueue extends Thread    {// Наша очередь из сотрудников, наследник класса Thread
    private String[] names;

    PeopleQueue(String... names) {// Конструктор, аргумент- массив имен сотрудников
        this.names = names;
    }

    @Override
    public void run() { // Этот метод будет вызван при старте потока
        for (int i = 0; i < names.length; i++) { // Вывод в цикле с паузой 0.5 сек очередного сотрудника
            System.out.println("Обработаны documentы: " + names[i]);
            try {
                sleep(500); // Задержка в 0.5 сек
            } catch (Exception e) {}
        }
    }
}

public class HR    {// Класс для демонстрации работы потока
    public static void main(String[] args) {
        // Создаем две очереди
        PeopleQueue queue1 = new PeopleQueue("Ivan","Сергей","Николай","Фердинанд","Basil");
        PeopleQueue queue2 = new PeopleQueue("Мария","Людмила","Алиса","Карина","Olga");

        System.out.println("Начали!"); // Сообщение из главного потока программы
        queue1.start();    //Запускаем одну очередь (дочерний поток)
        queue2.start(); //Запускаем вторую (дочерний поток)
    }
}
בואו נפעיל את התוכנית. המסוף מציג את פלט ההודעה מהשרשור הראשי. לאחר מכן, כל שרשור ילד queue1בתורו queue2מוציא הודעות לקונסולה המשותפת שלו לגבי העובד המעובד הבא. אחת האפשרויות האפשריות לתוכנית:
Начали!
Обработаны documentы: Мария
Обработаны documentы: Ivan
Обработаны documentы: Людмила
Обработаны documentы: Сергей
Обработаны documentы: Алиса
Обработаны documentы: Николай
Обработаны documentы: Карина
Обработаны documentы: Фердинанд
Обработаны documentы: Ольга
Обработаны documentы: Васorй

Process finished with exit code 0
ריבוי שרשורים בג'אווה הוא נושא מורכב ורב פנים. היכולת לכתוב קוד באמצעות מחשוב מקביל, ריבוי משימות ומחשוב ריבוי הליכי תעזור לך ליישם ביעילות משימות על מעבדים מרובים ליבות ואשכולות מודרניים המורכבים ממחשבים רבים.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION