동시에 실행되는 두 개의 스레드가 있고, 한 스레드로 실행 된 코드에는 다음과 같은 죽은 루프가 포함되어 있다고 가정 해 봅시다.
샘플 코드 (코드는 인터넷에서 시작)
공개 클래스 서비스 {Object Object1 = new Object (); public void methoda () {synchronized (object1) {system.out.println ( "methoda begin"); 부울 iscontinuerun = true; // (iscontinuerun) {} system.out.println ( "Methoda end"); }} Object Object2 = new Object (); public void methodb () {synchronized (object2) {system.out.println ( "methodb begin"); System.out.println ( "Methodb end"); }}} 두 스레드 클래스의 구현은 다음과 같습니다.
import service.service; public class schelda 확장 스레드 {private service service; public threada (서비스 서비스) {super (); this.service = 서비스; } @override public void run () {service.methoda (); }} 스레드 a 메소드 ()를 실행하고 메소드 ()에 데드 루프가 있습니다.
import service.service; public class schorkb 확장 스레드 {private service service; public threadb (서비스 서비스) {super (); this.service = 서비스; } @override public void run () {service.methodb (); }}스레드 B는 메소드를 실행합니다. 스레드 A가 메소드 ()에서 Dead Loop으로 들어가면 스레드 B가 실행 및 완료 될 수 있습니까?
테스트 클래스
import service.service; import extthread.threada; import extthread.threadb; public class run {public static void main (String [] args) {service service = new Service (); Threada athread = New Threada (서비스); athread.start (); Threadb bthread = new Threadb (서비스); bthread.start (); }}스레드 A와 스레드 B에 의해 얻은 객체 잠금은 동일한 잠금이 아니기 때문에 스레드 B를 실행하고 완료 할 수있는 결과에서 볼 수 있습니다. Thread A는 where dead loop에 들어가기 때문에 Thread A는 계속 실행하고 실행됩니다 (전체 프로그램이 종료되지 않음). 그러나 스레드 B는 종료됩니다.
즉, 스레드 A가 항상 실행 중이지만 CPU를 차지해야합니다. 그러나 스레드 스케줄링은 JVM 또는 운영 체제의 책임입니다. 스레드 A가 지속적으로 반복되는 동안 스레드 B가 CPU를 차지하지 않는다는 것을 의미하지는 않습니다. 스레드 A의 경우 "계산 집약적"작업과 동일합니다. 우리의 거부 루프가 특정 조건이 사실인지 지속적으로 테스트하면이 방법은 CPU의 낭비입니다. 폴링 중에 "스레드 간 통신 메소드"두 번째 포인트의 Java 다중 스레드 Java 지점 간의 스레드 간의 통신 메소드의 "스레드 간 통신 방법"의 특정 예를 참조 할 수 있습니다.
service.java가 다음과 같이 수정 된 경우 :
공공 클래스 서비스 {// Object Object1 = new Object (); public void methoda () {synchronized (this) {system.out.println ( "methoda begin"); 부울 iscontinuerun = true; // (iscontinuerun) {} system.out.println ( "Methoda end"); }} // Object Object2 = new Object (); public void methodb () {synchronized (this) {system.out.println ( "methodb begin"); System.out.println ( "Methodb end"); }}}스레드 A가 먼저 객체 잠금을 얻는 경우 스레드 A는 while 루프로 인해 항상 while 루프 안에 있습니다. 스레드 B는 잠금을 얻을 수 없기 때문에 Methodb ()를 실행할 수 없습니다.
한 스레드가 동기화 된 메소드에서 종료 할 수없고 잠금을 해제 할 수없는 경우 다른 스레드는 무한히 대기 할 수 있음을 알 수 있습니다.
위는이 기사에 관한 것입니다. Java Multithreading을 배우는 것이 모두 도움이되기를 바랍니다.