Java Thread Sleep () 및 Wait ()의 자세한 설명 및 예제
잠
1. 수면은 정적 실의 정적 방법입니다. 이를 통해 Runnable에 의해 구현 된 스레드는 수면 방법을 사용할 수 있습니다. 또한 실로어 교착 상태를 유발하기 전에 수면 () 메소드를 서로 호출하는 것을 피합니다.
2. 수면 ()은 실행할 때 수면 시간을 주어야합니다. 수면 중에 (블로킹 스레드 중) CPU는이 스레드를 포기하고 다른 작업을 수행합니다. 수면 시간이 올라가면 스레드가 자동으로 깨어나지만 스레드는 즉시 실행되지 않지만 CPU가 다른 스레드와 경쟁하기 위해 리소스를 할당 할 때까지 기다립니다.
3. 또한,이 스레드가 이전에 잠금 장치를 획득하면 수면 중에 자물쇠가 방출되지 않습니다. 이 기계 잠금을 기다리는 다른 프로그램은 실행 후이 스레드가 일어나고 실행될 때까지 기다려야합니다.
수면 관련 코드
Public Class ThreadTest2 {public static void main (String [] args) {System.out.println ( "테스트 시작"); strandsleep sleep = new ThreadSleep (); try {Thread Thread1 = new Thread (sleep, "passer a"); 스레드 스레드 2 = 새 스레드 (수면, "통행인 B"); thread1.start (); Thread2.start (); } catch (예외 e) {e.printstacktrace (); } system.out.println ( "테스트는 끝났다"); }} Class Threadsleep emplements runnable {int count = 0; @override public void run () {system.out.println (thread.currentthread (). getName () + "Say : Hello Sleep !!"); 세다(); } public void count () {while (count <20) {system.out.println (thread.currentthread (). getName () + "say : count is" + count); {count ++; Thread.sleep (100); } catch (예외 e) {e.printstacktrace (); }}}}출력 로그
우리의 테스트 테스트를 시작하십시오. Passerby A의 말 : Count는 0 Passerby B의 말 : 안녕하세요 수면 !! Passerby is 1 Passerby A Says : Count Is 2 Passerby B Says : Count Is 2 Passerby A Says : Count Is 4 Passerby B Says : Count is 6 Passerby B Says : Count is 7 Passerby B Says : Count A IS 8 Passerby A Says : Count Bo Says : 10 ASS SARTE는 10 IS 1 IS SORD IS 10 IS 10 IS SORD IS 10 ASS SARTE는 말합니다. Passerby B Says : Count is 14 Passerby a : Count is 14 Passerby a Says : Count is 16 Passerby B Says : Count is 16 Passerby A Says : Count 18 Passerby B Says : Count는 18입니다.
로그를 통해 스레드 A와 스레드 B가 기본적으로 교대로 실행된다는 것을 알 수 있지만 불규칙하며 동시성 문제가 있습니다.
이 상황은 코드가 수면 시간을 100 밀리 초로 설정하기 때문입니다. 카운트 증분 실행 속도가 매우 빠르기 때문에 스레드는 거의 동시에 잠을 자고 동시에 깨어나 동시성이 발생합니다.
다음으로, 수면 타이밍 잠금 장치가 해제되는지 확인하려면 동기화 블록을 추가해야합니다.
Public Class ThreadTest2 {public static void main (String [] args) {System.out.println ( "테스트 시작"); strandsleep sleep = new ThreadSleep (); try {Thread Thread1 = new Thread (sleep, "passer a"); 스레드 스레드 2 = 새 스레드 (수면, "통행인 B"); thread1.start (); Thread2.start (); } catch (예외 e) {e.printstacktrace (); } system.out.println ( "테스트는 끝났다"); }} Class Threadsleep emplements runnable {int count = 0; @override public void run () {system.out.println (thread.currentthread (). getName () + "Say : Hello Sleep !!"); 세다(); } public void count () {while (count <20) {synchronized (this) {system.out.println (thread.currentThread (). getName () + "say : count" + count); {count ++; Thread.sleep (100); } catch (예외 e) {e.printstacktrace (); }}}}}}출력 로그
테스트 통행인을 시작하십시오. Passerby a의 말 : Count는 0test is over passerby b의 말 : 안녕하세요 수면 !! 통행인은 1 권 a입니다. 카운트는 2 명의 통행인입니다. 카운트는 3 권력입니다. 카운트는 4 번의 패스 러브 a 말 : 카운트는 6 명입니다. 카운트 a는 a a 말 : 카운트 a는 : 카운트 a는 : 카운트 a는 : 카운트 a는 : 카운트 a는 다음과 같습니다. 13-passer a Says : Count는 14 패스 a입니다. Count is 15 passer a says : count is 16 passer a says : count is 17 passer a says : count is 18 passer a : Count는 19 패스 B입니다.
기본적으로 스레드 A가 실행되는 로그에서 볼 수 있습니다. 수면 중에는 기계 잠금이 항상 실 A에 있기 때문에 스레드 B는 스레드 A가 잠금을 방출 할 때까지 기다릴 수 있기 때문입니다.
기다리다
1. Wait ()는 객체 클래스의 메소드입니다. 대기 () 메소드가 호출되면 스레드는 객체와 관련된 대기 풀로 들어가서 잠금 장치를 방출합니다.
2. Wait ()를 실행 한 후에는 대기 스레드 풀에서 스레드를 깨우려면 notify () 메소드 또는 notifyall () 메소드를 사용하거나 대기 시간 (대기 시간)을 설정해야합니다.
3. Wait ()는 동기화 된 블록에 배치해야합니다. 그렇지 않으면 "java.lang.ilegalmonitorstateException"예외는 런타임에보고됩니다.
대기 관련 코드
Public Class ThreadTest2 {public static void main (String [] args) {System.out.println ( "테스트 시작"); strandsleep sleep = new ThreadSleep (); try {Thread Thread1 = new Thread (sleep, "passman a"); 스레드 스레드 2 = 새 스레드 (수면, "Passman B"); thread1.start (); Thread2.start (); } catch (예외 e) {e.printstacktrace (); } system.out.println ( "테스트는 끝났다"); }} Class Threadsleep emplements runnable {int count = 0; @override public void run () {system.out.println (thread.currentthread (). getName () + "Say : Hello Sleep !!"); 세다(); } public void count () {while (count <20) {synchronized (this) {system.out.println (thread.currentThread (). getName () + "say : count" + count); {count ++; this.wait (100); } catch (예외 e) {e.printstacktrace (); }}}}}}출력 로그
테스트 통행인을 시작하십시오. Passerby a의 말 : Count는 0test is over passerby b의 말 : 안녕하세요 수면 !! Passerby is 1 Passerby A Says : Count Is 2 Passerby B Says : Count is 3 Passerby A Says : Count Is 4 Passerby B Says : Count is 6 Passerby B Says : Count is 7 Passerby A Says : Count is Count a Says : Count a Says는 11 is 13입니다. Passerby B Says : Count is 14 Passerby A의 말 : Count is 15 Passerby B Says : Count is 16 Passerby A Says : Count 17 Passerby B Says : Count is 18 Passerby A Says : Count는 19입니다.
통나무를 통해 대기의 경우 잠금이 해제 될 것임을 알 수 있습니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!