이전 운영체제의 프로세스와 스레드에서 스레드에 대해 자세히 설명했습니다. 이번 글에서는 자바에서 멀티스레딩을 구현하는 방법을 좀 더 소개하겠습니다.
Java의 스레드 상태의 경우 다음과 같은 5가지 상태 모델을 사용할 수 있습니다.
생성, 준비, 실행 중, 차단 및 종료의 5가지 상태
생성 상태: JVM은 main() 메소드 메인 스레드를 생성합니다. 메인 스레드는 스레드 객체의 start() 메소드를 호출하여 자식 스레드를 시작합니다. 새로 생성된 스레드는 스레드 실행을 위한 다양한 조건이 충족되면 생성 상태에 들어갑니다. 준비 대기열.
그 외 다양한 상태는 프로세스와 스레드의 설명을 참고해주세요.
Java에서 스레드를 생성하는 방법에는 Thread 클래스를 상속하고 Runnable 인터페이스를 구현하는 두 가지 방법이 있습니다. 구체적인 소개는 다음과 같습니다.
멀티 스레딩은 Thread 클래스와 해당 하위 클래스 및 Runnable 인터페이스를 통해 Java에서 구현할 수 있습니다.
Thread 클래스는 스레드 객체를 직접 정의할 수 있지만 일반적으로 프로그래밍의 특별한 요구 사항을 충족하기 위해 멀티스레딩을 구현하려면 Thread 클래스의 하위 클래스를 정의해야 합니다. Java의 단일 상속에 의해 제한되는 실제 응용 프로그램에서는 거의 모든 다중 스레드 응용 프로그램이 실행 가능한 인터페이스를 구현하여 다중 스레드를 구현합니다.
즉, 새로 생성된 클래스가 다른 클래스를 상속하려는 경우 Java에서는 다중 상속을 지원하지 않기 때문에 다중 스레드 작업은 java.lang.Runnable 인터페이스를 구현해야만 완료할 수 있습니다. 동일한 프로그램 코드의 다중 스레드 동일한 리소스의 경우 가상 CPU(스레드)는 프로그램의 코드 및 데이터와 효과적으로 분리됩니다.
두 스레드를 구현하기 위한 코드는 다음과 같습니다.
public class ThreadDemo extends Thread { int i = 0; public void run(){ while (i<10){ System.out.println("实现Thread类继承的线程,正在占有处理机运行……"+i); try{ sleep(1000); i++; }catch (InterruptedException e){ e.printStackTrace(); } } } }
메인 함수에서는 클래스를 인스턴스화하고 start() 메서드를 호출하여 스레드를 생성하기만 하면 됩니다.
public class RunnableDemo implements Runnable { int i = 0; @Override public void run(){ while (i<10) { System.out.println("实现Runnable接口的线程,正在占有处理机运行……" + i); try { Thread.sleep(1000); i++; } catch (InterruptedException e) { e.printStackTrace(); } } } }
메인 함수 구현 방법:
Thread thread = new Thread(RunnableDemo ); Thread.start();
스레드 시작: thread.start()
스레드 끝: 해당 루프를 종료하는 마크 변수 설정 및 메서드
일시적으로 스레드 실행 차단 : Try{Thread.sleep(1000);}catch(InterruptedException e){ }
스레드 우선순위 설정: setPriority(int Priority) 메서드
Max_priority 스레드가 가질 수 있는 가장 높은 우선순위(보통 10)
Min_priority 가장 높은 우선순위 스레드는 다음을 가질 수 있습니다(보통 1)
Normal_priority 스레드에 할당되는 기본 우선순위(보통 5)
Java에는 두 가지 유형의 스레드가 있습니다: 사용자 스레드(User Thread) 및 데몬 스레드(데몬 스레드) ) 데몬 스레드의 역할은 가비지 수집 스레드와 같은 다른 스레드의 실행을 위한 서비스를 제공하는 것입니다. Java 프로그램에서 데몬이 아닌 스레드가 있으면 전체 프로그램이 종료되지 않습니다.
通过setDaemon(true)方法设定守护线程
Jvm은 스레드에 CPU를 할당하는 역할을 담당하며 이를 스레드 스케줄링이라고 합니다. 원칙은 우선 순위가 높은 스레드가 동일한 우선 순위의 여러 스레드를 먼저 실행하고 타임 슬라이스에 따라 CPU 리소스를 직접 할당하는 것입니다. 회전
스레드의 불확실성: Java의 간단한 명령문은 CPU의 여러 명령에 해당합니다. 스레드가 방금 명령을 실행하고 예약되면 후속 스레드가 원래 데이터를 반복적으로 호출하여 스레드의 불일치가 발생합니다. . 결정적(원자 아님)
스레드 동기화: 동시에 실행되는 스레드는 데이터를 공유해야 하며, 이때 다른 스레드의 상태와 동작을 고려해야 합니다. 공유 데이터 작업의 무결성을 보장하기 위한 객체 뮤텍스 잠금 개념입니다. 각 개체는 "뮤텍스(lock, mutex)"라는 표시가 있는 모니터(모니터)에 해당합니다. 이 표시는 언제든지 하나의 스레드만 개체에 액세스할 수 있도록 하는 데 사용됩니다. 동기화된 키워드는 객체의 뮤텍스 잠금에 연결하는 데 사용됩니다.
동기화 사용법:
코드 조각 동기화됨(객체) {}
메서드의 경우: 동기화는 메소드 선언에 위치하며, 공용 동기화 무효 푸시(문자 c ){}는 동기화됨(this)과 동일하며 전체 메서드가 동기화된 메서드임을 나타냅니다.
스레드 동기화 제어:
wait() 메서드를 사용하여 객체 잠금을 해제합니다.
notify() 또는 informAll() 사용 대기 중인 스레드 중 하나 또는 전부를 준비 상태로 전환합니다
Java에서는 동기화 실행 중에 스레드가 개체 잠금 식별자를 해제하는 개체의 대기 메서드를 호출하고 알림을 동기화할 수 있습니다. 그런 다음 대기 상태에 들어가고 다른 스레드가 통지() 또는 통지() 메소드를 호출하면 대기 스레드에 알립니다.
구체적인 코드는 다음과 같습니다.
class CubbyHole { private int index = 0; private int[] data = new int[3]; public synchronized void put(int value){ while (index == data.length){ try{ this.wait(); }catch (InterruptedException e){ e.printStackTrace(); } } data[index++] = value; this.notify(); } public synchronized int get(){ while (index <=0) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } int value = data[index--]; this.notify(); return value; } }
간단한 동기화에서는 잠금과 잠금 해제가 교착 상태 문제, 즉 서로를 기다리는 문제를 쉽게 일으킬 수 있습니다. Java는 멀티스레딩 문제를 해결하기 위해 1.5 이후에 몇 가지 방법을 도입했습니다.
JDK1.5부터는 단일 변수, 컬렉션, 타이머 및 스레드 풀과 같은 더욱 유용한 일련의 기능을 제공합니다.
원자 변수 java.util.concurrent.atomic 패키지 AtomicInteger 클래스
GetAndIncrement() 메소드는 스레드 액세스가 안전한지 보장합니다.
동시 컬렉션 클래스 Java.util.concurrent 패키지는 CopyOnWriteArrayList 및 CopyOnWriteSet 클래스를 추가합니다.
매우 적합한 객체입니다. 적게 쓰고 더 자주 읽는 것
ConcurrentHashMap
ArrayBlockingQueue 생산자와 소비자는 put 및 get을 사용합니다
스레드 풀 사용
스레드 풀 관련 클래스 ExecutorService 인터페이스, ThreadPoolExecutor 클래스 Executors 도구 클래스
공통 사용법 ExecutorService pool = Executors.newCachedThreadPool()
실행( Runnable r ) 방법
위 내용은 이것은 확실히 Java 멀티스레딩에 대한 가장 자세한 설명입니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!