1. 소개
Java 멀티 스레드 형식의 스레드 간의 커뮤니케이션에 대한 나의 이해에 대한이 요약은 주로 텍스트와 함께 코드에서 공연 한 스레드 간의 커뮤니케이션에 대해 논의하므로 책에서 몇 가지 예제 코드를 발췌 한 것입니다.
2. 스레드 간의 통신 방법
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 멀티 스레드 스레드 간의 커뮤니케이션 방법이 내가 공유하는 모든 내용입니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.