JavaRush /Java Blog /Random-KO /Java의 멀티스레딩

Java의 멀티스레딩

Random-KO 그룹에 게시되었습니다

소개

Java 스레드에 대해 알아보기 전에 가까운 미래를 살펴보겠습니다. 이력서를 제출하고 인터뷰를 했다고 가정해 보세요. 당신과 수십 명의 미래 동료들이 대규모 소프트웨어 회사에서 일하도록 초대되었습니다. 다른 번거로움 중에서도 피곤한 HR 직원에게 고용을 위해 종이 문서를 제출해야 합니다.
Java의 멀티스레딩 - 1
프로세스 속도를 높이기 위해 해당 직위에 대한 지원자를 두 그룹으로 나누고 두 명의 HR 관리자(회사에 있는 경우)에게 배포할 수 있습니다. 결과적으로 병렬 설계 작업으로 인해 프로세스 속도가 빨라집니다.
Java의 멀티스레딩 - 2
회사에 인사 담당자가 한 명 뿐이라면 어떻게 든 나가야 할 것입니다. 예를 들어, 모든 사람을 다시 두 그룹으로 나눌 수 있습니다. 예를 들어 소녀와 소년을 차례로 인터뷰할 수 있습니다.
Java의 멀티스레딩 - 3
또는 다른 원칙에 따르면 하위 그룹에 더 많은 사람이 있으므로 소년 한 명에 소녀 두 명을 번갈아 가며 사용합니다.
Java의 멀티스레딩 - 4
이러한 작업 구성 방식을 멀티스레드 라고 합니다 . 피곤한 HR 담당자는 다른 그룹으로 전환하여 다음 직원을 채용합니다. 아마도 11개의 그룹과 4명의 인사담당관이 있을 것입니다. 이 경우 멀티스레딩 처리는 여러 HR에 의해 병렬로 발생하며, HR은 모든 그룹의 다음 사람을 데려와 문서를 처리할 수 있습니다.

프로세스

이 경우의 프로세스( 프로세스 )는 문서 접수 업무의 정리가 됩니다. 조직에서는 회계, 소프트웨어 개발, 고객과의 회의, 창고 운영 등 여러 프로세스를 구분할 수 있습니다. 각 프로세스에 리소스가 할당됩니다(사무실, 실행을 위한 직원). 프로세스는 서로 격리되어 있습니다. HR 담당자는 회계 데이터베이스에 액세스할 수 없으며 고객 서비스 관리자는 창고를 돌아다니지 않습니다. 프로세스가 다른 사람의 리소스에 액세스해야 하는 경우 메모, 공동 회의 등 프로세스 간 통신을 구축해야 합니다.

스트림

프로세스의 작업은 스레드( java thread)로 구성됩니다. HR 부서의 경우 흐름은 그룹에 봉사하기 위한 업무 조직입니다. 첫 번째 그림에는 하나의 흐름이 있고 다음 세 개에는 두 개의 흐름이 있습니다. 프로세스 내에서 스레드는 병렬로 실행될 수 있습니다. 두 명의 HR 담당자가 두 개 이상의 미래 직원 그룹을 수용합니다. 인사 담당자와 그룹의 상호 작용(프로세스 내 스레드 처리)을 스레드 동기화 라고 합니다 . 한 명의 인사 담당자가 두 그룹을 디자인한 그림은 유니폼(소녀-소년-소녀-소년)과 서로 다른 우선 순위(두 소녀가 한 소년으로 번갈아 가며) 방법을 보여줍니다. 스레드는 자신이 속한 프로세스의 리소스에 액세스할 수 있습니다. HR 담당자 그룹에는 신청서 샘플, 문서 작성용 펜이 제공됩니다. 그러나 흐름이 공통적인 것과 상호 작용하면 사고가 발생할 수 있습니다. 인사 담당관이 줄의 마지막 사람의 이름을 외치라고 하면 두 그룹의 경우 여자 이름을 듣게 될지 남자 이름을 듣게 될지 미리 확신할 수 없습니다. 이러한 데이터 액세스 충돌, 차단 및 해결 방법은 매우 중요한 주제입니다.

흐름 상태

각 스레드는 다음 상태 중 하나에 있습니다.
  • 생성됨( New) – HR 담당자 라인이 준비 중이고 사람들이 정리되고 있습니다.
  • 시작됨( Runnable) – HR 담당자를 위해 대기열이 줄을 섰고 처리 중입니다.
  • 차단됨( Blocked) – 대기열의 마지막 남자가 이름을 외치려 하지만, 다음 그룹의 여자가 자신보다 먼저 이름을 외치기 시작했다는 소식을 듣고 그는 침묵했습니다.
  • 완료됨( Terminated) - HR 담당자가 전체 대기열을 완료했으며 더 이상 필요하지 않습니다.
  • Waiting( Waiting) - 한 큐가 다른 큐의 신호를 기다리고 있습니다.
스레드의 구성과 상호 작용은 프로세스의 효과적인 운영을 위한 기초입니다.

IT 세계로 돌아가자

21세기에는 멀티스레드와 병렬 실행이 중요해졌습니다. 지난 세기 90년대부터 멀티태스킹 운영 체제인 Windows, MacOS 및 Linux가 가정용 컴퓨터에 확고하게 자리 잡았습니다. 4개 이상의 코어 프로세서를 찾을 수 있는 경우가 많습니다. GPU 비디오 카드의 병렬 블록 수는 이미 1,000개를 초과했습니다. 인기 있는 프로그램은 멀티스레딩(멀티스레딩)을 고려하여 작성되었습니다(예: Adobe Photoshop, WinRar, Mathematica, 최신 게임 등 그래픽, 비디오 처리 또는 대용량 데이터 작업을 위한 최신 버전의 소프트웨어). Java 멀티스레딩은 매우 중요하고 대중적이며 복잡한 주제입니다. 따라서 JavaRush 과정에는 이를 잘 이해하기 위한 많은 작업이 있습니다. 멀티스레딩에 대한 Java 예제는 이 영역의 기본적인 뉘앙스와 미묘함을 익히고 스레드 작업을 동기화하는 데 도움이 됩니다.

프로세스

프로세스 는 운영 체제(OS)가 메모리, 프로세서 시간/코어 및 기타 리소스를 할당한 실행 중인 프로그램 인스턴스입니다. 메모리를 별도로 할당하는 것이 중요하며, 서로 다른 프로세스의 주소 공간은 서로 액세스할 수 없습니다. 프로세스가 통신해야 하는 경우 파일, 파이프 및 기타 프로세스 간 통신 방법을 사용하여 통신할 수 있습니다.

흐름

자바 Thread(스트림). Stream때로는 다른 Java 클래스 등과 의 혼동을 피하기 위해 Java 스레드를 스레드로 번역하는 경우가 많습니다. 이는 프로세스에 할당된 리소스를 사용하며 프로세스가 실행되는 방식입니다. 메인 스레드는 메소드를 실행 main하고 종료합니다. 프로세스가 실행되면 추가 스레드(자식 스레드)가 생성될 수 있습니다. 동일한 프로세스의 스레드는 서로 데이터를 교환할 수 있습니다. Java 멀티스레딩을 사용하려면 데이터 동기화를 고려해야 합니다. 이를 잊지 마십시오. Java에서는 마지막 스레드가 완료되면 프로세스가 종료됩니다. 백그라운드 작업의 경우 스레드는 데몬( )으로 시작될 수 있으며 일반 스레드와의 차이점은 프로세스의 스레드 daemon가 아닌 모든 프로세스가 종료될 때 강제로 종료된다는 점입니다 .daemon

최초의 멀티스레드 애플리케이션

스레드를 생성하는 방법은 6가지가 넘습니다. 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