Связь потока используется для обеспечения скоординированной работы потоков. Как правило, связь с потоком необходимо учитывать при синхронизации потоков.
1. Традиционная общение ниток
Обычно используются три метода, предоставленные классом ObjectLT:
Эти три метода должны быть вызваны объектом монитора синхронизации и разделены на две ситуации:
При синхронизации методов, поскольку монитор синхронизации является этим объектом, эти три метода можно назвать непосредственно.
Примеры следующие:
открытый класс syncmethodthreadcommunication {static class datawrap {int data = 0; логический флаг = false; public Synchronized void addthreada () {if (flag) {try {wait (); } catch (прерванное искусство e) {e.printstacktrace (); }} data ++; System.out.println (think.currentThread (). GetName () + "" + data); flag = true; notify (); } public Synchronized void AddThreadb () {if (! flag) {try {wate (); } catch (прерванное искусство e) {e.printstacktrace (); }} data ++; System.out.println (think.currentThread (). GetName () + "" + data); flag = false; notify (); }} static class threada extends {private DataWrap Data; public Threata (dataWrap dataWrap) {this.data = dataWrap; } @Override public void run () {for (int i = 0; i <10; i ++) {data.addthreada (); }}} static class threadb extends thread {private DataWrap Data; public ThintB (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 (); new Threada (dataWrap) .start (); new ThinteB (dataWrap) .start (); }}При синхронизации кодовых блоков вам необходимо использовать объект монитора, чтобы вызвать эти три метода.
Примеры следующие:
открытый класс syncblockthreadcomminication {static class datawrap {boolean flag; Int Data; } static class threada extends {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 (прерванное искусство e) {e.printstacktrace (); }} dataWrap.data ++; System.out.println (getName () + "" + dataWrap.data); dataWrap.flag = true; dataWrap.notify (); }}} / public Threatb (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 (прерванное искусство 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 (); new Threada (dataWrap) .start (); new ThinteB (dataWrap) .start (); }}2. Используйте условие для управления связью с потоком
При использовании объекта блокировки для обеспечения синхронизации объект условий используется для обеспечения координации.
Примеры следующие:
Импорт java.util.concurrent.locks.condition; import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; import com.sun.sund.sound.riffinvaliddataexcept DataWrap {int data; логический флаг; Private Final Lock Lock = new Reentrantlock (); частное условие окончательного условия = lock.newCondition (); public void addthreada () {lock.lock (); попробуйте {if (flag) {try {condity.await (); } catch (прерванное искусство e) {e.printstacktrace (); }} data ++; System.out.println (think.currentThread (). GetName () + "" + data); flag = true; Condition.Signal (); } наконец {lock.unlock (); }} public void addThreadb () {lock.lock (); попробуйте {if (! flag) {try {condity.await (); } catch (прерванное искусство e) {e.printstacktrace (); }} data ++; System.out.println (think.currentThread (). GetName () + "" + data); flag = false; Condition.Signal (); } наконец {lock.unlock (); }}} static class Threada extends Thread {DataWrap DataWrap; public Threada (dataWrap DataWrap) {this.DataWrap = dataWrap; } @Override public void run () {for (int i = 0; i <10; i ++) {dataWrap.addthreada (); }}} static class Threatb extends Thread {dataWrap DataWrap; public Threatb (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 (); new Threada (dataWrap) .start (); new ThinteB (dataWrap) .start (); }}Wait (), singal () и singalall () объекта условия соответствует методам wait (), notify () и notifyall () соответственно.
3. Используйте блокировку блокировки очереди для управления передачей потока.
Blockqueueue-это подвладевание интерфейса очереди, которая в основном используется для передачи потока. Он имеет функцию: когда нить продюсера пытается поместить элемент в блокировку, если очередь заполнена, нить заблокирована; Когда потребительский нить пытается вытащить элемент из блокировки, если очередь пуст, поток блокируется. Эти две функции соответствуют двум методам, которые поддерживают блокировку, положите (E E) и Take ()
Примеры следующие:
import java.util.concurrent.arrayblockingqueue; import java.util.concurrent.blockqueue; открытый класс блокировка } static class Threada Extends Thread {private Blockingqueue <dataWrap> blockqueue; public Threada (Blockqueue <TATAWRAP> Blockqueue, String name) {super (name); this.blockqueue = blockingqueue; } @Override public void run () {for (int i = 0; i <100; i ++) {try {dataWrap dataWrap = blockqueue.take (); dataWrap.data ++; System.out.println (getName () + "" + dataWrap.data); сон (1000); } catch (прерванное искусство e) {e.printstacktrace (); }}}}} static class Threadb extends Thread {private Blockingqueue <TATAWRAP> BlockingQueue; Приватный DataWrap DataWrap; public Threatb (Blockqueue <TATAWRAP> Blockqueue, DataWrap DataWrap, String name) {super (name); this.blockqueue = 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 (прерванное искусство e) {e.printstacktrace (); }}}} public static void main (string [] args) {/// Реализуйте два потока для добавления данных в очереди dataWrap dataWrap = new DataWrap (); Blockingqueue <TanaWrap> blockqueue = new Arrayblockingqueue <> (1); Новая Threada (Blockqueue, "потребитель"). start (); новый ThintB (Blockqueue, DataWrap, «Производитель»). start (); }}BlockingQueue имеет пять классов реализации:
Очередь по блокированию ArrayBlockingQueue на основе реализации массива
Очередь блокировки LinkedBlockqueueue на основе связанного списка
Элементы в приоритетной блокировке должны реализовать сопоставимый интерфейс, а упорядочение элементов настроено сортируется компаратором.
SynchronousQueue синхронизирует очередь, требуя, чтобы операции доступа в очереди должны были выполняться попеременно.
Элементы сбора задержек должны реализовать интерфейс задержки, а элементы в очереди отсортируются в соответствии с возвратным значением метода интерфейса задержки getDelay ().
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.