이 기사는 주로 Java 동시성의 전통적인 스레드 동기화 통신 기술의 코드 예제를 연구합니다.
먼저 질문을 봅시다 :
두 개의 스레드가 있습니다. 자식 스레드는 먼저 10 번 실행 한 다음 기본 스레드가 5 번 실행 된 다음 하위 스레드로 전환 한 다음 메인 스레드가 5 번 실행됩니다 ...이 왕복 여행은 50 회입니다.
이 질문을 읽은 후에는 스레드 간의 의사 소통이 사용되는 것이 분명합니다. 먼저 아이디어를 분석하겠습니다. 먼저 두 개의 스레드가 있어야하며 각 스레드에 50 번의 루프가 있어야합니다. 각 스레드는 50 회 반올림 작업을 수행해야하므로 기본 스레드의 작업은 5 번 실행하는 것이며 자식 스레드의 작업은 10 번 실행하는 것입니다. 스레드 간 통신 기술은 주로 wait() 메소드 및 notify() 메소드를 사용합니다. 대기 () 메소드는 현재 스레드가 대기하고 잠금 고정 된 잠금을 해제하게합니다. notify() 메소드는이 객체 모니터에서 대기하는 단일 스레드가 깨어 났음을 나타냅니다. 이 스레드 간 커뮤니케이션 문제를 단계별로 완료합시다.
먼저, 기본 스레드와 하위 스레드 간의 의사 소통에 관계없이 각 스레드에서 실행할 작업을 작성하십시오.
public class rasitivethreadcommunication {public static void main (string [] args) {// 어린이 스레드 열기 새 스레드 (new runnable () {@override public void run () {for (int i = 1; i <= 50; i ++) {synchronized (rasistativethreadcommunication.class) {j = 1 <; {system.out.println ( " +j +"의 " +J +", 루프의 " +i);}}}}). start (); // 메인 메소드는 (int i = 1; i <= 50; i ++)의 기본 스레드입니다. {synchronized (rasistativethreadcommunication.class) {j = 1; {system.out.println ( " + i);}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}위에서 언급했듯이, 두 개의 스레드는 각각 50 개의 큰 루프와 50 개의 작업을 실행하며, 자식 스레드의 작업은 10 번 실행되며 기본 스레드의 작업은 5 번 실행됩니다. 두 스레드 간의 동기화를 보장하기 위해 동기화 된 동기화 코드 블록이 사용되며 동일한 잠금이 사용됩니다 : 클래스의 바이트 코드 객체. 이것은 스레드 안전을 보장합니다. 그러나이 디자인은 그리 좋지 않습니다. 이전 섹션의 교착 상태에 쓴 것처럼 스레드 작업을 클래스에 넣을 수 있습니다. 이 디자인의 패턴은 더 구조화되어 있으며 다른 스레드 작업을 동일한 클래스에 넣으면 클래스에서 동일한 잠금을 사용하기 쉽기 때문에 동기화 문제를 쉽게 해결할 수 있습니다. 따라서 위의 프로그램을 수정하십시오.
public class rassportthreadcommunication {public static void main (string [] args) {비즈니스 비즈니스 = 새로운 비즈니스 (); // 새로운 스레드 작업 처리 클래스 // 어린이 스레드 새 스레드 (new runnable () {@override public void run () {(int i = 1; i <= 50; i ++) {bussiness.sub (i)); (int i = 1; i <= 50; i ++) {bussiness.main (i);}}}의 기본 스레드 (동기화 잠금 포함) 또는 동일한 클래스로 분류해야 할 몇 가지 공통 방법을 분류해야합니다. 이 디자인은 고급 클러스터링 프로그램의 견고성을 반영합니다. 클래스 비즈니스 {public synchronized void sub (int i) {for (int j = 1; J <= 10; J + "," + i);}}의 루프 이 수정 후, 프로그램 구조는 더 명확하고 강력 해집니다. 동기화 된 키워드를 두 스레드 작업 방법에 추가 하고이 잠금을 사용하십시오. 그러나 아직 두 스레드 사이에는 의사 소통이 없습니다. 실행 결과는 메인 스레드가 작업을 50 회 반복하고 하위 스레드가 작업을 50 회 반복한다는 것입니다. 동기화 된 동기화가 있기 때문에 그 이유는 매우 간단합니다.
다음은 질문에 설명 된대로 두 스레드 간의 통신을 허용하기 위해 프로그램을 계속 개선합니다.
public class rassportthreadcommunication {public static void main (string [] args) {비즈니스 비즈니스 = 새로운 비즈니스 (); // 새로운 스레드 작업 처리 클래스 // 어린이 스레드 새 스레드 (new runnable () {@override public void run () {(int i = 1; i <= 50; i ++) {bussiness.sub (i)); (int i = 1; i <= 50; i ++) {bussiness.main (i);}}}의 기본 스레드 공통 데이터 (동기화 잠금 포함)를 사용하려면 동일한 클래스로 분류해야합니다. 이 디자인은 Gao Lei 드라마와 프로그램의 견고성을 반영합니다. 클래스 비즈니스 {Private Boolean BshouldSub = true; public synchronized void sub (int i) {while (! bshouldSub) {// 실행 할 차례가 아닌 경우 대기 () 메소드를 호출하는 객체는 동기화 된 잠금 객체와 동일해야합니다. 여기서 동기화 된 방법은이 방법에 있으므로이} catch (InterpruptedException e) {// todo auto-auto-auto-auto-auto-auto-auto-auto-auto-auto-auto-}} for (int j = 1; j <= 10; j ++) {system.out.println ( " + j +"의 " + j +"의 서브 스레드 순서; this.notify (); // 메인 스레드 대기 대기} 대중 동기화 된 void main (int i) {while (bshouldSub) {// 실행에 대한 차례가 아닌 경우 {this.wait ();} catch (InterpruptedException e) {// to auto-genceated catch.printstacktrace (); ++) {System.out.println ( " + j +"의 "메인 스레드 시퀀스," + i);} bshouldSub = true; // 태그 변경 this.notify (); // 대기 자식 스레드 깨우기}}}}우선, 특정 프로그램 구현에 대해 이야기하지 말고, 구조적 관점에서 우리는 이미이 설계의 이점을 깨달았습니다. 주요 기능의 어떤 것도 수정할 필요가 없으며, 스레드 간 동기화 및 스레드 간 커뮤니케이션에 대한 논리는 모두 비즈니스 클래스에 있습니다. 기본 기능의 다른 스레드는 클래스에 배치 된 해당 작업 만 호출하면됩니다. 그것은 높은 무리의 이점을 반영합니다.
특정 코드를 다시 살펴 보겠습니다. 먼저 부울 변수를 정의하여 실행 해야하는 스레드를 식별하십시오. 어린이 실이 아닌 경우 잠을 자게됩니다. 그런 다음 자연스럽게 기본 스레드를 실행합니다. 실행 후 BshouldSub를 수정하고 자식 실을 깨우게됩니다. 현재, 아동 스레드는 만족스럽지 않고 잠을 자지 않을 것이라고 판단 할 것입니다. 자식 스레드 작업을 실행합니다. 마찬가지로, 메인 스레드가 BshouldSub를 수정 한 후, 두 번째 루프가 기본 스레드 작업을 실행하는 데 사용되면 자식 스레드가 깨어날 때까지 기다립니다. 이것은 논리를 매우 명확하게 만듭니다. 메인 스레드와 하위 스레드는 각각의 작업을 실행하기 위해 차례로 차례대로,이 리듬은 총 50 배입니다.
또 다른 작은 설명이 있습니다. 실제로 판단 할 경우 실제로 사용하는 것이 가능하지만 왜 사용 하는가? 때로는 실이 열렬하게 깨어날 수 있기 때문에 (그것은 분명히 자고 있지만 서있는 몽유병과 같습니다). 만약 그것을 사용한다면, 그것이 깨어 난 후에, 그것은 판단하기 위해 돌아 오지 않으면, 그것은 자연스럽게 작업을 실행하게됩니다. 좋아, 다른 스레드가 실행되고 있으며 플래시에서 다른 스레드에 영향을 미칩니다. 그러나 시간이 다르다면 다를 것입니다. 실이 거짓으로 깨어 있더라도 여전히 판단 할 것입니다. 그러나 현재 다른 스레드가 실행 중입니다. BshouldSub는 수정되지 않았으므로 여전히 들어가서 다시 자고 있습니다. 그래서 그것은 매우 안전하며 다른 스레드에 영향을 미치지 않습니다! 이것은 공식 JDK 문서에서도 수행됩니다.
스레드 간의 의사 소통을 요약하겠습니다.
위의 내용은 Java 동시성의 전통적인 스레드 동기화 통신 기술 코드에 대한 자세한 설명이며, 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!