스레드 통신은 스레드의 조정 된 작동을 보장하는 데 사용됩니다. 일반적으로 스레드 동기화를 수행 할 때 스레드 통신을 고려해야합니다.
1. 전통적인 스레드 커뮤니케이션
일반적으로 ObjectLt 클래스가 제공하는 세 가지 방법이 사용됩니다.
이 세 가지 방법은 동기화 모니터 객체에 의해 호출되어야하며 두 가지 상황으로 나뉩니다.
동기화 방법이 동기화 모니터 가이 객체 이므로이 세 가지 방법을 직접 호출 할 수 있습니다.
예는 다음과 같습니다.
공개 클래스 syncMethodThreadCommunication {static class datawrap {int data = 0; 부울 플래그 = 거짓; public synchronized void addthreada () {if (flag) {try {wait (); } catch (InterruptedException e) {e.printstacktrace (); }} data ++; System.out.println (thread.currentthread (). getName () + "" + data); flag = true; notify (); } public synchronized void addThreadb () {if (! flag) {try {wait (); } catch (InterruptedException e) {e.printstacktrace (); }} data ++; System.out.println (thread.currentthread (). getName () + "" + data); flag = false; notify (); }} 정적 클래스 스레드는 스레드 {private datawrap data; public threada (datawrap datawrap) {this.data = datawrap; } @override public void run () {for (int i = 0; i <10; i ++) {data.addthreada (); }}} 정적 클래스 스레드는 스레드 {private datawrap data; public threadb (datawrap datawrap) {this.data = datawrap; } @override public void run () {for (int i = 0; i <10; i ++) {data.addthreadb (); }}} public static void main (String [] args) {// 두 스레드를 구현하여 데이터를 추가하여 Datawrap Datawrap = new Datawrap (); 새 threada (datawrap) .start (); new Threadb (datawrap) .start (); }}코드 블록을 동기화 할 때는 모니터 객체를 사용 하여이 세 가지 메소드를 호출해야합니다.
예는 다음과 같습니다.
공개 클래스 syncblockthreadcomminication {static class datawrap {부울 플래그; int 데이터; } 정적 클래스 스레드는 스레드 {datawrap datawrap; public threada (datawrap datawrap) {this.datawrap = datawrap; } @override public void run () {for (int i = 0; i <10; i ++) {synchronized (datawrap) {if (datawrap.flag) {try {datawrap.wait (); } catch (InterruptedException e) {e.printstacktrace (); }} datawrap.data ++; System.out.println (getName () + "" + datawrap.data); datawrap.flag = true; datawrap.notify (); }}}}} static class streadb extends stread {datawrap datawrap; public threadb (datawrap datawrap) {this.datawrap = datawrap; } @override public void run () {for (int i = 0; i <10; i ++) {synchronized (datawrap) {if (! datawrap.flag) {try {datawrap.wait (); } catch (InterruptedException e) {e.printstacktrace (); }} datawrap.data ++; System.out.println (getName () + "" + datawrap.data); datawrap.flag = false; datawrap.notify (); }}}} public static void main (String [] args) {// 두 스레드를 구현하여 데이터를 추가하여 Datawrap Datawrap = new Datawrap (); 새 threada (datawrap) .start (); new Threadb (datawrap) .start (); }}2. 조건을 사용하여 스레드 통신을 제어합니다
잠금 객체를 사용하여 동기화를 보장 할 때 조건 객체를 사용하여 조정을 보장합니다.
예는 다음과 같습니다.
import java.util.concurrent.locks.condition; import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; import com.sun.media.sound.riffinvaliddataexception; import javafx.scene.chart.data; 정적 클래스 Datawrap {int data; 부울 깃발; 개인 최종 잠금 잠금 = 새로운 reintrantlock (); 개인 최종 조건 조건 = lock.newcondition (); public void addthreada () {lock.lock (); try {if (flag) {try {condition.await (); } catch (InterruptedException e) {e.printstacktrace (); }} data ++; System.out.println (thread.currentthread (). getName () + "" + data); flag = true; 조건 .signal (); } 마침내 {lock.unlock (); }} public void addThreadb () {lock.lock (); try {if (! flag) {try {condition.await (); } catch (InterruptedException e) {e.printstacktrace (); }} data ++; System.out.println (thread.currentthread (). getName () + "" + data); flag = false; 조건 .signal (); } 마침내 {lock.unlock (); }}} 정적 클래스 스레드는 스레드 {datawrap datawrap; public threada (datawrap datawrap) {this.datawrap = datawrap; } @override public void run () {for (int i = 0; i <10; i ++) {datawrap.addthreada (); }}} 정적 클래스 스레드는 스레드 {datawrap datawrap; public threadb (datawrap datawrap) {this.datawrap = datawrap; } @override public void run () {for (int i = 0; i <10; i ++) {datawrap.addthreadb (); }}} public static void main (String [] args) {// 두 스레드를 구현하여 데이터를 추가하여 Datawrap Datawrap = new Datawrap (); 새 threada (datawrap) .start (); new Threadb (datawrap) .start (); }}조건 객체의 Await (), singal () 및 singalall ()은 각각 wait (), notify () 및 notifyall () 메소드에 해당합니다.
3. 차단 큐 블록 큐어를 사용하여 스레드 통신을 제어하십시오
Blockingqueue는 주로 스레드 통신에 사용되는 큐 인터페이스의 하위 인터페이스입니다. 기능이 있습니다 : 생산자 스레드가 요소를 블록 링크에 넣으려고 할 때 큐가 가득 차면 스레드가 차단됩니다. 소비자 스레드가 Blockingqueue에서 요소를 꺼내려고하면 큐가 비어 있으면 스레드가 차단됩니다. 이 두 가지 기능은 차단, put (e e) 및 take ()를 지원하는 두 가지 방법에 해당합니다.
예는 다음과 같습니다.
import java.util.concurrent.arrayblockingqueue; import java.util.concurrent.blockingqueue; public class blockingqueuethreadcomminication {static class datawrap {int data; } 정적 클래스 스레드는 스레드 {private blockingqueue <datawrap> blockingqueue; public threada (blockingqueue <datawrap> blockingqueue, 문자열 이름) {super (name); this.blockingqueue = blockingqueue; } @override public void run () {for (int i = 0; i <100; i ++) {try {datawrap datawrap = blockingqueue.take (); datawrap.data ++; System.out.println (getName () + "" + datawrap.data); 수면 (1000); } catch (InterruptedException e) {e.printstacktrace (); }}}}} 정적 클래스 스레드는 스레드 {private blockingqueue <datawrap> blockingqueue; 개인 데이터 랩 데이터 랩 랩; public ThreadB (Blockingqueue <Datawrap> Blockingqueue, Datawrap Datawrap, String Name) {Super (이름); this.blockingqueue = blockingqueue; this.datawrap = datawrap; } @override public void run () {for (int i = 0; i <100; i ++) {try {datawrap.data ++; System.out.println (getName () + "" + datawrap.data); blockingqueue.put (datawrap); 수면 (1000); } catch (InterruptedException e) {e.printstacktrace (); }}}} public static void main (String [] args) {/// 두 스레드를 구현하여 데이터를 추가하여 Datawrap Datawrap = new Datawrap (); Blockingqueue <datawrap> blockingqueue = new Arrayblockingqueue <> (1); 새 류다 (Blockingqueue, "Consumer"). start (); New Threadb (Blockingqueue, Datawrap, "Producer"). start (); }}Blockingqueue에는 5 가지 구현 클래스가 있습니다.
배열 구현을 기반으로 한 ArrayBlockingqueue Blockingqueue 대기열
LinkedBlockingqueue Blockingqueue 큐 링크 된 목록을 기반으로합니다
PriorityBlockingQueue의 요소는 비교 가능한 인터페이스를 구현해야하며 요소의 순서는 비교기에 의해 정의됩니다.
동기식 큐는 큐를 동기화하여 큐의 액세스 작업을 교대로 수행해야합니다.
Delayqueue Collection 요소는 지연 인터페이스를 구현해야하며 큐의 요소는 지연 인터페이스 메소드 getDelay ()의 리턴 값에 따라 정렬됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.