JavaRush /Blog Java /Random-VI /Đa luồng trong Java

Đa luồng trong Java

Xuất bản trong nhóm

Giới thiệu

Trước khi tìm hiểu về các luồng Java, chúng ta hãy nhìn vào tương lai gần. Hãy tưởng tượng bạn đã gửi sơ yếu lý lịch của mình và có một cuộc phỏng vấn. Bạn và hàng chục đồng nghiệp tương lai đã được mời vào làm việc tại một công ty Phần mềm lớn. Trong số những rắc rối khác, bạn cần phải nộp hồ sơ xin việc bằng giấy cho một nhân viên nhân sự đang mệt mỏi.
Đa luồng trong Java - 1
Để đẩy nhanh quá trình, những người ứng tuyển vào vị trí này có thể được chia thành hai nhóm và phân bổ giữa hai người quản lý nhân sự (nếu có trong công ty). Kết quả là chúng tôi tăng tốc quá trình nhờ công việc thiết kế song song .
Đa luồng trong Java - 2
Nếu trong công ty chỉ có một nhân viên nhân sự thì bạn sẽ phải tìm cách thoát ra ngoài bằng cách nào đó. Ví dụ: bạn lại có thể chia mọi người thành hai nhóm, chẳng hạn như phỏng vấn lần lượt các cô gái và chàng trai.
Đa luồng trong Java - 3
Hoặc theo một nguyên tắc khác: vì nhóm dưới có nhiều người hơn nên chúng ta sẽ luân phiên hai nữ một nam.
Đa luồng trong Java - 4
Cách tổ chức công việc này được gọi là đa luồng . Nhân viên nhân sự mệt mỏi của chúng tôi chuyển sang các nhóm khác nhau để tuyển nhân viên tiếp theo từ họ. Có lẽ có mười một nhóm và bốn sĩ quan nhân sự. Trong trường hợp này, việc xử lý đa luồng sẽ diễn ra song song bởi một số nhân sự, những người này có thể chỉ định người tiếp theo từ bất kỳ nhóm nào để xử lý tài liệu của mình.

Quy trình

Quy trình ( process ) trong trường hợp này sẽ là việc tổ chức công việc tiếp nhận văn bản. Trong một tổ chức, có thể phân biệt một số quy trình: kế toán, phát triển phần mềm, gặp gỡ khách hàng, vận hành kho hàng, v.v. Nguồn lực được phân bổ cho mỗi quy trình: cơ sở, nhân viên để thực hiện. Các quy trình được tách biệt với nhau: Nhân viên nhân sự không có quyền truy cập vào cơ sở dữ liệu kế toán và người quản lý dịch vụ khách hàng không chạy quanh kho. Nếu một quy trình cần giành quyền truy cập vào tài nguyên của người khác, thì cần phải thiết lập liên lạc giữa các quy trình: bản ghi nhớ, cuộc họp chung.

Dòng

Công việc trong một tiến trình được tổ chức thành các luồng ( java thread). Đối với bộ phận nhân sự, flow là việc tổ chức công việc để phục vụ một nhóm. Trong bức ảnh đầu tiên có một dòng chảy, trong ba bức ảnh tiếp theo có hai dòng chảy. Trong quy trình này, các luồng có thể được thực thi song song - hai nhân viên nhân sự chấp nhận hai hoặc nhiều nhóm nhân viên tương lai. Sự tương tác của nhân viên nhân sự với các nhóm - việc xử lý các luồng trong một quy trình - được gọi là đồng bộ hóa luồng . Các bản vẽ thiết kế hai nhóm do một cán bộ nhân sự thực hiện thể hiện các phương pháp: đồng phục (gái - trai - gái - trai) và có mức độ ưu tiên khác nhau (hai gái xen kẽ với một trai). Các chủ đề có quyền truy cập vào các tài nguyên của quy trình mà chúng thuộc về: các nhóm dành cho nhân viên nhân sự được cung cấp mẫu đơn đăng ký, bút để điền tài liệu. Nhưng nếu các dòng chảy tương tác với những thứ chung của chúng thì sự cố có thể xảy ra. Nếu nhân viên nhân sự yêu cầu bạn hét tên người cuối cùng trong hàng đợi, thì trong trường hợp có hai nhóm, anh ta không chắc chắn trước liệu mình sẽ nghe thấy tên phụ nữ hay tên đàn ông. Những xung đột, chặn truy cập dữ liệu như vậy và cách giải quyết chúng là một chủ đề rất quan trọng.

Trạng thái dòng chảy

Mỗi thread ở một trong các trạng thái sau:
  • Đã tạo ( New) – hàng ghế dành cho nhân viên nhân sự đã sẵn sàng, mọi người đang sắp xếp ngăn nắp.
  • Đã khởi chạy ( Runnable) – hàng đợi của chúng tôi đã xếp hàng cho nhân viên nhân sự và đang được xử lý.
  • Bị chặn ( Blocked) – chàng trai cuối cùng trong hàng cố gắng hét lên một cái tên, nhưng khi nghe thấy cô gái ở nhóm bên cạnh bắt đầu làm điều này trước mình, anh ta im lặng.
  • Đã hoàn thành ( Terminated) - toàn bộ hàng đợi đã được nhân viên nhân sự hoàn thành và không cần thiết phải làm như vậy.
  • Đang chờ ( Waiting) – một hàng đợi đang chờ tín hiệu từ hàng đợi khác.
Việc tổ chức các luồng và sự tương tác của chúng là cơ sở cho hoạt động hiệu quả của các tiến trình.

Hãy quay trở lại thế giới CNTT

Trong thế kỷ 21, việc thực thi đa luồng và song song đã trở nên phù hợp. Từ những năm 90 của thế kỷ trước, các hệ điều hành đa nhiệm Windows, MacOS và Linux đã trở nên vững chắc trên máy tính gia đình. Bạn thường có thể tìm thấy bốn bộ xử lý lõi trở lên trong đó. Số lượng khối song song của card màn hình GPU đã vượt quá một nghìn. Các chương trình phổ biến được viết có tính đến đa luồng (đa luồng), chẳng hạn như các phiên bản hiện đại của phần mềm xử lý đồ họa, video hoặc hoạt động với lượng dữ liệu lớn: Adobe Photoshop, WinRar, Mathematica, các trò chơi hiện đại. Đa luồng trong Java là một chủ đề rất quan trọng, phổ biến và phức tạp. Vì vậy, trong khóa học JavaRush có rất nhiều nhiệm vụ để bạn hiểu rõ về nó. Các ví dụ Java về đa luồng sẽ giúp bạn nắm vững các sắc thái cơ bản và tinh tế của lĩnh vực này, đồng bộ hóa công việc của các luồng.

Quá trình

Quy trình là một phiên bản đang chạy của một chương trình mà Hệ điều hành (HĐH) đã phân bổ bộ nhớ, thời gian/lõi xử lý và các tài nguyên khác. Điều quan trọng là bộ nhớ được phân bổ riêng biệt; không gian địa chỉ của các tiến trình khác nhau không thể truy cập được lẫn nhau. Nếu các tiến trình cần giao tiếp, chúng có thể thực hiện bằng cách sử dụng các tệp, đường dẫn và các phương thức giao tiếp giữa các tiến trình khác.

Chảy

Java Thread(luồng). Đôi khi, để tránh nhầm lẫn với các lớp Java khác Streamvà các lớp tương tự, các luồng Java thường được dịch là một luồng. Chúng sử dụng các tài nguyên được phân bổ cho một tiến trình và là cách thức tiến trình được thực thi. Luồng chính thực thi phương thức mainvà thoát. Khi một tiến trình thực thi, các luồng bổ sung (luồng con) có thể được sinh ra. Các thread của cùng một tiến trình có thể trao đổi dữ liệu với nhau. Đa luồng Java yêu cầu phải tính đến đồng bộ hóa dữ liệu, đừng quên điều đó. Trong Java, một tiến trình kết thúc khi luồng cuối cùng của nó kết thúc. Đối với các tác vụ nền, một luồng có thể được bắt đầu dưới dạng daemon ( daemon), điểm khác biệt so với một tác vụ thông thường là chúng sẽ bị chấm dứt cưỡng bức khi tất cả daemoncác luồng không phải của tiến trình chấm dứt.

Ứng dụng đa luồng đầu tiên

Có hơn nửa tá cách để tạo luồng; trong khóa học JavaRush, chúng ta sẽ xem xét chúng một cách chi tiết. Đầu tiên, chúng ta hãy làm quen với một trong những điều cơ bản. Có một lớp đặc biệt Threadtrong phương thức run()mà bạn cần viết mã thực hiện logic chương trình. Sau khi tạo một chủ đề, bạn có thể bắt đầu nó bằng cách gọi phương thức start(). Hãy viết một chương trình demo triển khai một ví dụ về đa luồng 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(); //Запускаем вторую (дочерний поток)
    }
}
Hãy khởi động chương trình. Bảng điều khiển hiển thị đầu ra thông báo từ luồng chính. Tiếp theo, mỗi luồng con queue1lần queue2lượt xuất các thông báo tới bảng điều khiển chung của chúng về nhân viên được xử lý tiếp theo. Một trong những lựa chọn khả thi cho chương trình:
Начали!
Обработаны documentы: Мария
Обработаны documentы: Ivan
Обработаны documentы: Людмила
Обработаны documentы: Сергей
Обработаны documentы: Алиса
Обработаны documentы: Николай
Обработаны documentы: Карина
Обработаны documentы: Фердинанд
Обработаны documentы: Ольга
Обработаны documentы: Васorй

Process finished with exit code 0
Đa luồng trong Java là một chủ đề phức tạp và nhiều mặt. Khả năng viết mã sử dụng tính toán song song, đa nhiệm và đa luồng sẽ giúp bạn thực hiện hiệu quả các tác vụ trên các bộ xử lý và cụm đa lõi hiện đại gồm nhiều máy tính.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION