이 기사는 이전 기사 "Java Multithreading 예제 (i)에 대한 자세한 설명"을 따릅니다.
4. Java Multithreads의 차단 상태 및 스레드 제어
위에서 언급 한 몇 가지 특정 유형의 Java 차단이 언급되어 있습니다. Java 스레드 막힘을 일으키는 주요 방법을 살펴 보겠습니다.
1. Join ()
결합 - 한 스레드가 실행을 계속하기 전에 다른 스레드가 완료 될 때까지 기다리십시오. 스레드 B의 join () 메소드에서 스레드 A가 호출되는 경우 스레드 실행 본체에서 스레드 A가 차단되고 스레드 B가 스레드 B의 실행을 완료 한 것으로 알려진 후에 만 A는 계속 실행할 수 있습니다.
공개 클래스 스레드 테스트 {public static void main (string [] args) {myrunnable myrunnable = new myrunnable (); 스레드 스레드 = 새 스레드 (myrunnable); for (int i = 0; i <100; i ++) {system.out.println (thread.currentthread (). getName () + "" + i); if (i == 30) {thread.start (); try {thread.join (); // 메인 스레드는 계속 실행하기 전에 스레드 스레드가 실행될 때까지 기다려야합니다} catch (InterpruptedException e) {e.printstacktrace (); }}}}}}}}}}}}}}}}}}}}}}}}}}}2. 수면 ()
수면 - 현재 실행중인 스레드가 지정된 시간을 일시 중지하고 차단 상태로 들어가게하십시오. 잠자리에 들면 스레드는 준비 상태가 아니기 때문에 실행할 기회를 얻지 못할 것입니다. 현재 시스템에 다른 실행 가능한 스레드가 없더라도 Sleep ()의 스레드는 실행되지 않습니다. 따라서 Sleep () 메소드는 종종 스레드 실행을 일시 중지하는 데 사용됩니다.
앞에서 언급했듯이, 새로 생성 된 스레드의 start () 메소드가 호출되면 스레드는 준비 상태로 들어가서 CPU 타임 슬라이스를 실행하여 실행할 수 있습니다. 새 스레드가 특정 필요성으로 즉시 실행되기를 원한다면 원래 스레드의 수면 (1)을 직접 호출하십시오.
공개 클래스 스레드 테스트 {public static void main (string [] args) {myrunnable myrunnable = new myrunnable (); 스레드 스레드 = 새 스레드 (myrunnable); for (int i = 0; i <100; i ++) {system.out.println (thread.currentthread (). getName () + "" + i); if (i == 30) {thread.start (); try {thread.sleep (1); // 스레드가 즉시 실행되도록합니다} catch (InterruptedException e) {e.printstacktrace (); }}}}}}}}}}}}}}}}}}}}}}}}}}}참고 : CPU가 유휴 상태가 아니며 새로 생성 된 스레드로 전환되기 때문에 1 밀리 초 동안 수면이 충분합니다.
3. 배경 스레드 (데몬 스레드)
개념/목적 : 배경 스레드는 주로 다른 스레드 (비교적 호출 된 전경 스레드) 또는 "데몬 스레드"에 서비스를 제공합니다. JVM의 쓰레기 수집 스레드와 같은.
수명주기 : 배경 스레드의 수명주기는 전경 스레드의 수명주기와 관련이 있습니다. 주로 반영됩니다. 모든 전경 스레드가 죽은 상태로 들어가면 배경 스레드가 자동으로 죽을 것입니다 (사실, 배경 스레드의 목적은 전경 스레드를 제공하는 것이기 때문에 이해하기 쉽습니다. 모든 전경 스레드가 죽었 기 때문에 여전히 그것을 유지하는 것은 ...
배경 스레드 설정 : 스레드 객체의 setDaemon (true) 메소드를 호출하면 지정된 스레드를 배경 스레드로 설정할 수 있습니다.
공개 클래스 스레드 테스트 {public static void main (String [] args) {스레드 Mythread = new Mythread (); for (int i = 0; i <100; i ++) {system.out.println ( "메인 스레드 i ="+i); if (i == 20) {mythread.setdaemon (true); mythread.start (); }}}}} class mythread는 스레드 {public void run () {for (int i = 0; i <100; i ++) {system.out.println ( "i ="+i); try {thread.sleep (1); } catch (InterruptedException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); }}}}스레드가 배경 스레드인지 결정하십시오. 스레드 객체의 isdeamon () 메소드를 호출하십시오.
참고 : 기본 스레드는 기본적으로 전경 스레드이며, 전경 스레드 생성에서 생성 된 자식 스레드는 기본적으로 전경 스레드이며, 배경 스레드에서 생성 된 스레드는 기본적으로 배경 스레드입니다. 전경 스레드를 배경 스레드로 설정하기 위해 SetDeamon (True) 메소드를 호출 할 때 start () 메소드가 호출되기 전에야합니다. 스레드가 어제 전날에 사망 한 후 JVM은 배경 스레드에 죽음을 알리지 만 지침을받는 데 일정 시간이 걸립니다.
4. 스레드의 우선 순위 변경/setPriority () :
각 스레드는 실행시 우선 순위가 있으며 우선 순위가 높은 스레드는 더 많은 실행 기회가 있습니다. 각 스레드는 그것을 만든 스레드와 우선 순위와 동일합니다. 기본 스레드는 기본적으로 정상 우선 순위를 갖습니다.
스레드 우선 순위 : setPriority (int priorityLevel). 매개 변수 우선 레벨 범위는 1-10이며 일반적으로 사용되는 세 가지 정적 상수 값은 다음과 같습니다.
max_priority : 10
Min_Priority : 1
NORM_PRIORITY : 5
스레드 우선 순위 : getPriority ().
참고 : 스레드 우선 순위가 높은 스레드 오브젝트는이 스레드가 우선 순위 실행보다는 더 많은 실행 기회를 가지고 있음을 의미합니다.
공개 클래스 스레드 테스트 {public static void main (String [] args) {스레드 Mythread = new Mythread (); for (int i = 0; i <100; i ++) {system.out.println ( "메인 스레드 i ="+i); if (i == 20) {mythread.setPriority (Thread.Max_Priority); mythread.start (); }}}}} class mythread는 스레드 {public void run () {for (int i = 0; i <100; i ++) {system.out.println ( "i ="+i); }}}5. 스레드 양보 : 수율 ()
수율 ()의 기본 역할은 이전 블로그 게시물에서 논의되었습니다. 동시에, 수율 () 방법은 스레드 우선 순위와 관련이 있습니다. 스레드가 EILED () 메소드를 호출하여 실행 상태에서 준비 상태로 전환하면 CPU는 준비 상태 스레드 큐에서 실행하기 위해 스레드와 우선 순위 이상의 우선 순위가 동일한 스레드 만 선택합니다.
공개 클래스 스레드 테스트 {public static void main (String [] args) {Thread Mythread1 = new Mythread1 (); 스레드 mythread2 = new Mythread2 (); Mythread1.SetPriority (thread.max_priority); mythread2.setpriority (thread.min_priority); for (int i = 0; i <100; i ++) {system.out.println ( "메인 스레드 i ="+i); if (i == 20) {mythread1.start (); mythread2.start (); thread.yield (); }}}}} class mythread1은 스레드를 확장합니다 {public void run () {for (int i = 0; i <100; i ++) {system.out.println ( "Mythread 1 -i ="+i); }}} class mythread2 스레드 {public void run () {for (int i = 0; i <100; i ++) {system.out.println ( "Mythread 2 -i ="+i); }}}일련의 기사 :
Java 다중 스레드 인스턴스의 설명 (i)
Java 다중 스레드 인스턴스에 대한 자세한 설명 (II)
Java 다중 스레드 인스턴스에 대한 자세한 설명 (III)