Java Threading <br />의 개념 대부분의 다른 컴퓨터 언어와 달리 Java는 내장 된 멀티 스레드 프로그래밍을 지원합니다.
다중 스레드 프로그램에는 동시에 실행되는 두 개 이상의 부품이 포함되어 있습니다. 프로그램의 각 부분은 스레드라고하며 각 스레드에는 독립적 인 실행 경로가 있습니다. 따라서 멀티 스레딩은 특별한 형태의 멀티 태스킹입니다.
멀티 태스킹은 실제로 모든 현대 운영 체제에서 지원되기 때문에 알아야합니다. 그러나 프로세스 기반 및 스레드 기반의 두 가지 유형의 멀티 태스킹이 있습니다. 둘의 차이점을 이해하는 것이 매우 중요합니다.
많은 독자들에게 프로세스 기반 멀티 태스킹은보다 친숙한 형태입니다. 프로세스는 본질적으로 실행 프로그램입니다. 따라서 프로세스 기반 멀티 태스킹은 컴퓨터가 동시에 두 개 이상의 프로그램을 실행할 수 있도록하는 것이 특징입니다. 예를 들어, 프로세스 기반 멀티 태스킹을 사용하면 텍스트 편집기를 사용하는 동안 Java 컴파일러를 동시에 실행할 수 있습니다. 프로세스 기반 멀티 태스킹에서 프로그램은 스케줄러가 할당 한 가장 작은 코드 단위입니다.
스레드 기반 멀티 태스킹 환경에서 스레드는 가장 작은 실행 장치입니다. 이는 프로그램이 두 개 이상의 작업의 기능을 동시에 수행 할 수 있음을 의미합니다. 예를 들어, 텍스트 편집기는 인쇄하는 동안 텍스트를 포맷 할 수 있습니다. 따라서 다중 프로세스 프로그램은 "큰 그림"을 처리하는 반면 다중 스레드 프로그램은 세부 사항을 처리합니다.
멀티 스레드 프로그램은 다중 프로세스 프로그램보다 덜 관리 비용이 필요합니다. 프로세스는 자체 독립적 인 주소 공간이 필요한 헤비급 작업입니다. 프로세스 간 통신은 비싸고 제한됩니다. 프로세스 간의 변환도 매우 비싸다. 반면에 실은 가벼운 플레이어입니다. 그들은 동일한 주소 공간을 공유하고 동일한 프로세스를 함께 공유합니다. 스레드 간 커뮤니케이션은 저렴하며 스레드 간 변환도 저렴합니다. Java 프로그램이 다중 프로세스 작업 처리 환경을 사용하는 경우 다중 프로세스 프로그램은 Java에 의해 제어되지 않으며 멀티 스레딩은 Java에 의해 제어됩니다.
멀티 스레딩은 유휴 시간이 최소로 유지되므로 최대 CPU 사용으로 효율적인 프로그램을 작성하는 데 도움이됩니다. 이는 자유 시간이 공개되기 때문에 Java에서 실행되는 대화식 네트워크 상호 연결 환경에 중요합니다. 예를 들어, 네트워크의 데이터 전송 속도는 컴퓨터의 처리 용량보다 훨씬 낮으며 로컬 파일 시스템 리소스의 읽기 및 쓰기 속도는 CPU의 속도보다 훨씬 낮습니다. . 기존의 단일 스레드 환경에서, 귀하의 프로그램은 다음 단계를 수행하기 전에 각 작업이 완료 될 때까지 기다려야합니다. 멀티 스레딩을 사용하면이 자유 시간을 최대한 활용할 수 있습니다.
자바 스레딩 모델
Java 런타임 시스템은 여러 가지 방법으로 스레드에 의존하며 모든 클래스 라이브러리 설계는 멀티 스레딩을 고려합니다. 실제로 Java는 스레드를 사용하여 전체 환경을 비동기식으로 만듭니다. 이는 CPU 루프의 폐기물을 방지하여 유효하지 않은 부분을 줄이는 데 도움이됩니다.
멀티 스레드 환경의 장점을 더 잘 이해하려면 제어와 비교할 수 있습니다. 단일 스레드 시스템의 처리 방법은 폴링이라는 이벤트 루프 방법을 사용하는 것입니다. 이 모델에서 단일 스레드 제어는 무한 루프로 실행되며 다음에 수행 할 작업을 결정하기 위해 일련의 이벤트를 폴링합니다. 폴링 장치가 네트워크 파일을 읽을 준비가 된 신호를 반환하면 이벤트 루프 스케줄링 제어는 적절한 이벤트 핸들러에 관리됩니다. 이벤트 핸들러가 돌아올 때까지 시스템에서 다른 이벤트가 발생하지 않습니다. 이것은 CPU 시간을 낭비합니다. 이로 인해 프로그램의 일부가 시스템을 독점적으로 차지하고 다른 이벤트의 실행을 방지합니다. 일반적으로 단일 스레드 환경에서 스레드가 블록 (블록, 실행 중단)에서 리소스를 기다리는 동안 전체 프로그램이 실행을 중지합니다.
Java Multithreading의 장점은 메인 루프/폴링 메커니즘을 취소한다는 것입니다. 프로그램의 다른 부분에 영향을 미치지 않으면 서 스레드를 일시 중지 할 수 있습니다. 예를 들어, 스레드가 네트워크에서 데이터를 읽거나 사용자 입력 대기를 기다릴 때 생성 된 유휴 시간은 다른 곳에서 사용될 수 있습니다. 멀티 스레딩을 사용하면 전체 시스템을 일시 중지하지 않고 각 프레임 간격에서 라이브 루프가 1 초 동안 잠을 잘 수 있습니다. Java 프로그램에는 스레드 막힘이 있으며 하나의 스레드 만 중단되고 다른 스레드는 계속 실행됩니다.
스레드는 여러 상태에 있습니다. 스레드가 실행 중일 수 있습니다. CPU 시간을 얻는 한 실행할 수 있습니다. 러닝 스레드를 중단하고 일시적으로 실행을 방해 할 수 있습니다. 매달린 스레드를 재개하여 자원을 기다리는 동안 스레드를 차단할 수 있습니다.
언제든지 스레드가 종료 될 수있어 즉시 작동을 방해합니다. 종료되면 스레드를 복원 할 수 없습니다.
스레드 우선 순위
Java는 각 스레드를 우선시하여 다른 스레드와 비교할 때 스레드를 처리하는 방법을 결정합니다. 스레드 우선 순위는 스레드 간의 우선 순위 관계를 자세히 설명하는 정수입니다. 절대적인 가치로서 우선 순위는 하나만 없을 때 우선 순위가 높은 스레드는 우선 순위가 낮은 스레드보다 빠르게 실행되지 않습니다. 대신, 스레드 우선 순위는 한 스레드에서 다른 스레드로 전환 할시기를 결정하는 데 사용됩니다. 이것을 "컨텍스트 스위치"라고합니다. 컨텍스트 변환 발생을 결정하는 규칙은 간단합니다.
스레드는 자동으로 제어를 포기할 수 있습니다. I/O 미정의 경우, 수면 또는 차단은 명백한 양보로 수행됩니다. 이 가정하에, 다른 모든 스레드가 감지되고 실행 준비가 된 가장 높은 우선 순위가 CPU에 부여됩니다.
스레드는 우선 순위가 높은 스레드에 의해 선점 될 수 있습니다. 이 경우 우선 순위가 낮은 스레드는 적극적으로 포기하지 않으며 프로세서는 먼저 점유됩니다. 수행중인 작업에 관계없이 프로세서는 우선 순위가 높은 스레드에 의해 점유됩니다. 기본적으로 우선 순위가 높은 스레드가 실행되면 실행됩니다. 이것을 우선 순위 멀티 태스킹이라고합니다.
동일한 우선 순위의 두 스레드가 CPU주기와 경쟁 할 때 상황은 약간 복잡합니다. Windows 98과 같은 운영 체제의 경우, 우선 순위가 동일 한 스레드는 자동으로 루프 모드에서 시간을 나눕니다. Solaris 2.X와 같은 다른 운영 체제의 경우 우선 순위 스레드가 동료에 비해 자동으로 포기됩니다. 그렇지 않은 경우 다른 스레드는 실행되지 않습니다.
경고 : 다른 운영 체제에서 우선 순위가 낮은 스레드의 컨텍스트 변환으로 오류가 발생할 수 있습니다.
동기화
Multithreading은 프로그램에 비동기 동작을 도입하므로 필요할 때 동기화를 향상시키는 방법이 있어야합니다. 예를 들어, 두 스레드가 서로 통신하고 링크 된 목록 시퀀스와 같은 복잡한 데이터 구조를 공유하려면 서로 충돌하지 않도록하는 방법이 필요합니다. 즉, 다른 스레드가 링크 된 목록에서 데이터를 읽는 동안 한 스레드가 데이터를 작성하는 것을 방지해야합니다. 이를 위해 Java는 이전 프로세스 간 동기화 모델을 기반으로 한 다른 방법을 구현합니다. 관리 프로세스는 Carhoare에 의해 처음 정의 된 제어 메커니즘입니다.
관리 프로세스를 하나의 스레드 만 제어하는 작은 상자로 생각할 수 있습니다. 스레드가 파이프로 들어가면 모든 스레드가 스레드가 파이프를 종료 할 때까지 기다려야합니다. 이러한 방식으로 관리를 사용하여 공유 리소스가 여러 스레드에 의해 조작되는 것을 방지 할 수 있습니다.
많은 다중 스레드 시스템은 관리 프로세스를 프로그램이 명확하게 참조하고 작동 해야하는 객체로 간주합니다. Java는 명확한 솔루션을 제공합니다. 대신 "모니터"클래스가 없으며, 각 객체에는 암시 적 조작이 있으며, 이는 객체의 동기화 방법이 호출 될 때 자동으로로드됩니다. 스레드가 동기화 메소드에 포함되면 다른 스레드는 동일한 객체의 동기화 메소드를 호출 할 수 없습니다. 이를 통해 동기화 지원이 언어에 내장되어 있으므로 매우 명확하고 간결한 다중 스레드 코드를 작성할 수 있습니다.
메시지 전달
프로그램을 여러 스레드로 나눈 후 각 스레드 간의 연결을 정의해야합니다. 대부분의 다른 언어로 계획 할 때는 재판 간 커뮤니케이션을 설정하기 위해 운영 체제에 의존해야합니다. 이것은 확실히 비용을 증가시킬 것입니다. 그러나 Java는 모든 객체가 가지고있는 사전 정의 된 메소드를 호출하여 멀티 스레드간에 대화 할 수있는 깨끗하고 저렴한 저렴한 방법을 제공합니다. Java의 메시징 시스템을 사용하면 스레드가 객체의 동기식 메소드를 입력 한 다음 다른 스레드가 명시 적으로 알릴 때까지 기다릴 수 있습니다.
스레드 클래스 및 실행 가능한 인터페이스
Java의 멀티 스레드 시스템은 스레드 클래스, 메소드 및 공동 회사 인터페이스를 기반으로합니다. 스레드 클래스는 스레드의 실행을 캡슐화합니다. 실행중인 스레드의 상태를 직접 참조 할 수 없으므로 프록시를 통해 처리해야하므로 스레드 인스턴스가 생성됩니다. 새 스레드를 만들려면 프로그램이 스레드를 확장하거나 런닝 가능한 인터페이스를 구현해야합니다.
스레드 클래스는 스레드를 관리하는 데 도움이되는 몇 가지 방법을 정의합니다. 이 장에 사용 된 방법은 표에 나와 있습니다.