JavaRush /Java Blog /Random-TW /Java 中的多線程

Java 中的多線程

在 Random-TW 群組發布

介紹

在學習 Java 線程之前,讓我們先展望一下不久的將來。想像一下您提交了履歷並進行了面試。您和數十位未來的同事已被邀請到一家大型軟體公司工作。除了其他麻煩之外,您還需要向疲憊的人力資源員工提交紙本就業文件。
Java 中的多執行緒 - 1
為了加快流程,該職位的申請人可以分為兩組,並分配給兩名人力資源經理(如果公司有的話)。因此,我們透過並行設計工作加快了流程。
Java 中的多執行緒 - 2
如果公司裡只有一名人事主管,那麼你就必須想辦法離開。例如,你可以再次將每個人分成兩組,例如依序訪問女孩和男孩。
Java 中的多執行緒 - 3
或根據另一個原則:由於下層的人多,我們就用兩個女孩換一個男孩。
Java 中的多執行緒 - 4
這種組織工作的方式稱為多執行緒。我們疲憊不堪的人力資源主管會切換到不同的團隊,從他們中招募下一位員工。大概有十一個小組和四名人事官員。在這種情況下,多線程處理將由多個 HR 並行進行,他們可以從任何組中挑選下一個人來處理他的文件。

流程

這種情況下的流程(process)將是文件接收工作的組織。在組織中,可以區分多個流程:會計、軟體開發、與客戶的會議、倉庫營運等。為每個流程分配資源:場所、執行員工。這些流程相互隔離:人力資源官員無法存取會計資料庫,客戶服務經理也不會在倉庫周圍跑來跑去。如果一個行程需要存取別人的資源,就需要建立進程間的通訊:備忘錄、聯席會議。

行程中的工作被組織成執行緒(java thread)。對人力資源部門來說,流程是為團隊服務的工作組織。在第一張圖片中有一個流程,在接下來的三張圖片中有兩個流程。在該流程中,線程可以並行執行 - 兩名人力資源官員接受兩組或更多組未來員工。人事官員與群組的交互(進程內線程的處理)稱為線程同步。一名人事官員設計的兩組的圖紙顯示了方法:制服(女孩 - 男孩 - 女孩 - 男孩)和不同的優先級(兩個女孩與一個男孩交替)。執行緒可以存取它們所屬流程的資源:向人力資源官員的群組提供申請表樣本、用於填寫文件的筆。但如果流與它們共有的事物相互作用,那麼就有可能發生事件。如果人事官員要求你喊出隊伍中最後一個人的名字,那麼,在兩組的情況下,他事先不確定他會聽到女人的名字還是男人的名字。此類資料存取衝突、阻塞以及解決方法是一個非常重要的主題。

流動狀態

每個執行緒都處於以下狀態之一:
  • 已創建 ( New) – 人力資源官員的隊伍已準備就緒,人員正在組織起來。
  • 已啟動 ( Runnable) – 我們的佇列已排隊人力資源官員並正在處理中。
  • 被阻止(Blocked)——隊列中最後一個年輕人試圖喊出一個名字,但當他聽到下一組的女孩在他之前開始這樣做時,他陷入了沉默。
  • 已完成 ( Terminated) - 整個隊列已由人力資源官員完成,無需再做。
  • Waiting( Waiting) – 一個佇列正在等待來自另一個佇列的訊號。
執行緒的組織及其互動是進程有效運作的基礎。

讓我們回到IT世界

在 21 世紀,多執行緒和並行執行已經變得重要。自 1990 年代以來,多工作業作業系統 Windows、MacOS 和 Linux 已在家用電腦上牢固確立。您通常可以在其中找到四個或更多核心處理器。GPU顯示卡的平行區塊數已經超過千個。流行的程式在編寫時考慮了多執行緒(多執行緒),例如,用於處理圖形、視訊或處理大量資料的現代版本軟體:Adobe Photoshop、WinRar、Mathematica、現代遊戲。Java 多執行緒是一個非常重要、受歡迎且複雜的議題。因此,在JavaRush課程中有很多任務需要很好地理解它。關於多執行緒的 Java 範例將幫助您掌握該領域的基本細微差別和微妙之處,同步執行緒的工作。

流程

進程是作業系統 (OS) 為其分配記憶體、處理器時間/核心和其他資源的程式的運行實例。重要的是記憶體是單獨分配的;不同進程的位址空間不能互相存取。如果進程需要通信,它們可以使用檔案、管道和其他進程間通訊方法來實現。

流動

Java Thread(流)。有時,為了避免與其他Java類別等混淆Stream,Java執行緒常常被翻譯為執行緒。它們使用分配給進程的資源,並且是進程執行的方式。主執行緒執行該方法main並退出。當進程執行時,可以產生額外的執行緒(子執行緒)。同一行程的執行緒之間可以交換資料。Java多執行緒需要考慮資料同步,不要忘記這一點。在 Java 中,進程在其最後一個執行緒完成時終止。對於後台任務,執行緒可以作為守護程序(daemon daemon)啟動,與常規任務不同的是,當daemon進程的所有非執行緒終止時,它們將被強制終止。

第一個多執行緒應用程式

創建線程的方法有六種以上;在 JavaRush 課程中我們將詳細研究它們。首先,讓我們熟悉一個基本的。有一個特殊的類,您需要Thread在其方法run()中編寫實現程式邏輯的程式碼。創建線程後,可以透過呼叫start(). 讓我們寫一個示範程式來實作 Java 多執行緒的範例。
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
Java 中的多執行緒是一個複雜且多面向的主題。使用平行、多任務和多執行緒計算編寫程式碼的能力將幫助您在現代多核心處理器和由許多電腦組成的叢集上有效地執行任務。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION