Java 다중 스레드 형식의 스레드 간의 통신에 대한 나의 이해에 대한이 요약은 주로 텍스트와 함께 코드 흡착 된 코드의 스레드 간의 통신에 대해 논의합니다. 따라서 나는 책에서 몇 가지 예제 코드를 발췌했으며 특정 내용은 다음과 같습니다.
synchronization
여기에 언급 된 동기화는 동기화 된 키워드를 사용하여 스레드 간의 통신을 실현하는 여러 스레드를 나타냅니다.
Reference example:
public class myObject {synchronized public void methoda () {// something .... Object.Methoda (); }} public class streadb extends stread {private myobject 객체; // 생성자 @override public void run () {super.run (); object.methodb (); }} public class run {public static void main (String [] args) {myObject 객체 = new myObject (); // 스레드 A와 스레드 B는 동일한 객체를 보유합니다. 객체 threada a = new Threada (Object); Threadb b = new Threadb (Object); a.start (); b.start (); }}스레드 A와 스레드 B는 동일한 myObject 클래스의 객체 객체를 유지하기 때문에이 두 스레드는 다른 메소드를 호출해야하지만 동기식으로 실행됩니다. 예를 들어, 스레드 B는 Methodb () 메소드를 실행하기 전에 Methoda () 메소드를 실행하기 위해 스레드 A를 기다려야합니다. 이런 식으로 스레드 A와 스레드 B는 의사 소통을 실현합니다.
이 방법은 본질적으로 "공유 메모리"커뮤니케이션입니다. 여러 스레드는 동일한 공유 변수에 액세스해야하며 누가 잠금을받는 사람 (액세스 권한을 얻음)을 실행할 수 있습니다.
여론 조사 방법
코드는 다음과 같습니다.
import java.util.arraylist; import java.util.list; public class mylist {private list <string> list = new arraylist <string> (); public void add () {list.add ( "요소"); } public int size () {return list.size (); }} import myList.Mylist; Public Class Threada 확장 스레드 {private mylist list; public threada (mylist list) {super (); this.list = list; } @override public void run () {try {for (int i = 0; i <10; i ++) {list.add (); System.out.println ( "추가" + (i + 1) + "요소"); Thread.sleep (1000); }} catch (InterruptedException e) {e.printstacktrace (); }}} import myList.mylist; public class 스레드는 스레드 {private mylist list; public ThreadB (myList List) {super (); this.list = list; } @override public void run () {try {while (true) {if (list.size () == 5) {system.out.println ( "== 5, 스레드 B가 종료 될 준비가되었습니다"); 새로운 InterruptedException ()을 던지십시오. }}} catch (InterruptedException e) {e.printstacktrace (); }}} import myList.Mylist; import extThread.threada; import extThread.threadb; public class test {public static void main (string [] args) {myList service = new MyList (); Threada a = New Threada (서비스); A.SETNAME ( "A"); a.start (); Threadb b = new Threadb (서비스); b.setName ( "b"); b.start (); }}이러한 방식으로 스레드 A는 조건을 지속적으로 변경하고 스레드 스레드는이 조건 (list.size () == 5)가 while 문을 통해 사실인지 끊임없이 감지하여 스레드 간의 통신을 실현합니다. 그러나이 방법은 CPU 자원을 낭비 할 것입니다. 자원을 낭비하는 이유는 JVM 스케줄러가 CPU를 실행을 위해 B에 CPU를 건네 주면 "유용한"작업을 수행하지 않지만 특정 조건이 사실인지 끊임없이 테스트하기 때문입니다. 실제 생활과 비슷합니다. 누군가는 전화가 휴대 전화 화면에 오는지를 계속보고 있습니다. 다른 일을하고 전화가 올 때 전화가 전화가 나오고 있음을 알립니다. 스레드 폴링의 영향과 관련하여 다음을 참조하십시오.
wait/알림 메커니즘
코드는 다음과 같습니다.
import java.util.arraylist; import java.util.list; public class mylist {private static list <string> list = new arraylist <string> (); public static void add () {list.add ( "anystring"); } public static int size () {return list.size (); }} public class streada 확장 스레드 {private 객체 잠금; public threada (객체 잠금) {super (); this.lock = 잠금; } @override public void run () {try {synchronized (lock) {if (mylist.size ()! = 5) {system.out.println ( "waint" + system.currenttimemillis ()); lock.wait (); System.out.println ( "대기 끝" + System.CurrentTimeMillis ()); }}} catch (InterruptedException e) {e.printstacktrace (); }}} public class streadb는 스레드 {private 객체 잠금; public Threadb (객체 잠금) {super (); this.lock = 잠금; } @override public void run () {try {synchronized (lock) {for (int i = 0; i <10; i ++) {mylist.add (); if (mylist.size () == 5) {lock.notify (); System.out.println ( "알림"); } system.out.println ( "추가" + (i + 1) + "요소!"); Thread.sleep (1000); }}} catch (InterruptedException e) {e.printstacktrace (); }}} public class run {public static void main (String [] args) {try {object lock = new Object (); Threada a = 새로운 threada (잠금); a.start (); Thread.sleep (50); Threadb b = new Threadb (잠금); b.start (); } catch (InterruptedException e) {e.printstacktrace (); }}}작업을 수행하기 전에 특정 조건이 충족 될 때까지 대기해야합니다. 스레드 B는 목록에 요소를 추가하고 목록의 크기를 변경합니다.
A와 B는 어떻게 전달됩니까? 다시 말해, 스레드 A는 그 List.Size ()가 이미 5임을 어떻게 알 수 있습니까?
여기서 우리는 객체 클래스의 대기 () 및 notify () 메소드를 사용합니다.
조건이 충족되지 않으면 (list.size ()! = 5)가 CPU를 포기하고 차단 상태에 들어가기 위해 ake ()를 삭제하십시오. --- 여론 조사와 같은 CPU를 취하지 마십시오
조건이 충족되면 스레드 B 호출 ()을 호출하여 스레드 A를 알리십시오.
이 방법의 장점 중 하나는 CPU 사용률이 증가했다는 것입니다.
그러나 몇 가지 단점이 있습니다. 예를 들어, Thread B는 먼저 실행하고 한 번에 5 개의 요소를 추가하고 Notify ()를 호출하여 알림을 보내고 A가 여전히 실행됩니다. 스레드 a가 실행하고 wait ()를 호출하면 결코 깨어나지 않습니다. Thread B는 이미 알림을 발행했으며 향후 알림을 발급하지 않기 때문입니다. 이것은 알림이 너무 이르고 프로그램의 실행 논리를 방해한다는 것을 보여줍니다.
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람들이 Java 프로그래밍을 배우는 것이 도움이되기를 바랍니다.