>  기사  >  Java  >  Java에서 스레드를 구현하는 방법은 무엇입니까? Java 스레드 구현 방법(그림 및 텍스트)

Java에서 스레드를 구현하는 방법은 무엇입니까? Java 스레드 구현 방법(그림 및 텍스트)

不言
不言원래의
2018-09-17 15:18:242056검색

이 글의 내용은 Java에서 스레드를 구현하는 방법에 관한 것입니다. Java 스레드(그림 및 텍스트)의 구현 방법에는 특정 참조 값이 있으므로 도움이 필요한 친구가 참조할 수 있기를 바랍니다.

프로세스 및 스레드

전통적인 운영 체제에서 핵심 개념은 "프로세스"이고 프로세스는 실행 중인 프로그램을 추상화한 것입니다.
프로세스의 존재로 인해 운영 체제에서는 여러 프로세스가 실행될 수 있으며 이러한 프로세스는 동시에 실행되는 것처럼 보입니다.
우리 컴퓨터가 웹 브라우저, 이메일 클라이언트, QQ WeChat과 같은 인스턴트 메시징 소프트웨어 등 여러 프로세스를 실행하고 있다면 이 프로세스가 모두 동시에 실행되고 있다고 생각합니다. 멀티 코어 CPU를 사용하면 여러 프로세스가 병렬로 실행되는 현상이 전혀 놀라운 일이 아닐 수 있습니다. 각 프로세스에 별도의 CPU를 할당하여 다중 프로세스 병렬 처리를 달성할 수 있습니다.
그러나 실제로 컴퓨터에 CPU가 하나만 있으면 인간에게 여러 프로세스가 동시에 실행되고 있다는 느낌을 줄 수도 있습니다. 그러나 인간의 감정은 종종 모호하고 부정확합니다. 사실 CPU의 계산 속도는 매우 빠르기 때문에 프로세스 간을 빠르게 전환할 수 있습니다. 특정 순간에는 CPU가 하나의 프로세스만 실행할 수 있지만 1초 안에 프로세스 간을 빠르게 전환할 수 있습니다. 여러 프로세스가 동시에 실행되는 듯한 착각을 불러일으킵니다.
운영 체제에서 스레드 개념은 왜 프로세스에서 파생되나요?

  1. 일부 프로세스의 경우 내부에서 여러 활동이 발생하고 일부 활동은 특정 시간에 차단될 수 있으며 일부 활동은 스레드로 분리되어 있으면 병렬로 실행될 수 있습니다. 프로그램을 디자인하게 됩니다.

  2. 스레드는 프로세스 생성보다 가볍고 성능 소모도 적습니다.

  3. 프로세스에 CPU 계산과 I/O 처리가 모두 필요한 경우 여러 스레드를 사용하면 이러한 활동이 중복되어 전체 프로세스 실행 속도가 빨라집니다.

각 프로세스는 운영 체제에서 독립적인 메모리 주소 공간을 가지고 있습니다. 프로세스에서 생성된 모든 스레드는 이 메모리를 공유합니다. 멀티 스레딩을 지원하는 운영 체제는 스레드를 CPU 스케줄링의 최소 단위로 사용합니다. CPU 시간 조각은 여러 스레드로 나뉩니다.

가능한 스레드 구현 방법

기본적으로 주류 운영체제는 스레드를 지원하고 스레드 구현도 제공합니다. 다양한 하드웨어 및 운영 체제의 차이에 대처하기 위해 Java 언어는 스레드 작업의 통합된 추상화를 제공합니다. Java에서는 Thread 클래스를 사용하여 스레드를 나타냅니다.
Thread의 특정 구현에는 다른 구현 방법이 있을 수 있습니다.

커널 스레드를 사용하여 구현

커널 스레드는 운영 체제 커널에서 지원하는 스레드입니다. 커널에는 시스템에서 생성되거나 생성된 모든 스레드를 기록하는 스레드 테이블이 있습니다. 파괴된 스레드는 시스템 호출을 포함해야 하며 커널의 스레드 테이블을 업데이트해야 합니다. 커널 스레드 차단 및 기타 작업에는 모두 시스템 호출이 포함되며 시스템 호출은 상대적으로 비용이 많이 들고 사용자 모드와 커널 모드 간 전환이 필요합니다. 또한 커널 내부에는 CPU 시간 분할을 할당해야 하는 스레드를 결정하는 스레드 스케줄러가 있습니다.
프로그램은 일반적으로 커널 스레드를 직접 운영하지 않고 경량 프로세스인 커널 스레드의 고급 인터페이스를 사용합니다. 경량 프로세스와 커널 스레드 간의 관계는 1:1입니다. 각 경량 프로세스는 커널 스레드에 의해 지원됩니다.

Java에서 스레드를 구현하는 방법은 무엇입니까? Java 스레드 구현 방법(그림 및 텍스트)

위 그림에서 LWP는 경량 프로세스인 Light Weight Process를 의미하고, KLT는 커널 스레드인 Kernel Level Thread를 의미합니다.

사용자 스레드를 사용하여 구현

사용자 스레드는 프로그램이나 프로그래밍 언어로 구현된 스레드 라이브러리입니다. 시스템 커널은 이러한 스레드의 존재를 감지할 수 없습니다. 사용자 스레드의 설정, 동기화, 파괴 및 스케줄링은 모두 커널의 도움이나 시스템 호출 없이 사용자 모드에서 완료됩니다. 이것의 장점은 스레드 작업이 매우 효율적이라는 것입니다. 이 경우 프로세스와 사용자 스레드의 비율은 1:N입니다.

Java에서 스레드를 구현하는 방법은 무엇입니까? Java 스레드 구현 방법(그림 및 텍스트)

사용자 모드 스레드는 스레드를 차단하는 방법에 직면할 때 어려움에 직면하게 되며, 사용자 모드 스레드를 차단하면 전체 프로세스가 차단되고 멀티스레딩은 그 의미를 잃게 됩니다. 커널 지원 부족으로 인해 스레드 차단 및 깨우기, 다중 CPU 환경에서의 스레드 매핑 등 커널 사용이 필요한 많은 작업을 구현하려면 사용자 프로그램이 필요하므로 구현하기가 매우 어렵습니다. .

사용자 스레드와 커널 스레드의 하이브리드 구현 사용

이 하이브리드 구현에는 사용자 스레드와 커널 스레드가 모두 있습니다. 사용자 모드 스레드를 생성하고 전환하는 작업은 여전히 ​​매우 효율적이며 사용자 모드에서 구현된 스레드를 사용하면 스레드 크기를 더 쉽게 늘릴 수 있습니다. 운영 체제 커널의 지원이 필요한 기능은 다른 프로세서로의 매핑, 스레드 차단 및 깨우기 처리, 커널 스레드 스케줄링 등 커널 스레드를 통해 구현됩니다. 이 구현에서는 사용자 스레드와 커널 스레드 사이를 연결하는 경량 프로세스 LWP를 계속 사용합니다.

Java에서 스레드를 구현하는 방법은 무엇입니까? Java 스레드 구현 방법(그림 및 텍스트)

Java 스레드 구현

JDK1.2 이전에는 사용자 스레드를 사용하여 Java 스레드를 구현했습니다. JDK1.2 이후에는 운영 체제에서 기본적으로 지원하는 스레딩 모델을 사용하여 Java를 구현했습니다. 모델은 주로 운영 체제에 따라 구현됩니다. Oracle JDK의 경우 Windows 및 Linux의 스레딩 모델은 일대일 방식으로 구현됩니다. 즉, Java 스레드가 경량 프로세스(커널 스레드)에 매핑됩니다. Solaris 플랫폼에서 Java는 1:1 및 N:M 스레드 모델을 지원합니다.

스레드 차단 및 대기

Java의 스레드 상태는 New, Runnable, Waiting, TimedWaiting, Blocked, Terminating입니다.

Java에서 스레드를 구현하는 방법은 무엇입니까? Java 스레드 구현 방법(그림 및 텍스트)

  • NEW: 스레드가 처음에 생성되었지만 실행되지 않습니다

  • RUNNABLE: 스레드가 실행 중이지만 반드시 CPU를 소비하지는 않습니다

  • BLOCKED: 스레드가 다른 스레드를 기다리고 있습니다. 잠금을 해제하려면

  • WAITING: wait, Join, LockSupport.park() 메서드를 실행한 스레드

  • TIMED_WAITING: sleep, wait, Join, LockSupport.parkNanos()라는 스레드 및 기타 메서드와 다릅니다. 대기 상태인 경우 이러한 메소드에는 시간 매개변수 표현이 있습니다.

Blocked와 Waiting의 중요한 차이점은 Blocked 상태의 스레드가 배타적 잠금을 획득하기 위해 기다리고 있다는 것입니다. 예를 들어 스레드가 동기화된 키워드로 둘러싸인 임계 섹션에 들어가기를 기다리고 있으면 Blocked 상태로 들어갑니다. 상태. 대기(Waiting) 상태는 깨어나기를 기다리거나 일정 시간 동안 기다리는 상태입니다.

위 내용은 Java에서 스레드를 구현하는 방법은 무엇입니까? Java 스레드 구현 방법(그림 및 텍스트)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.