자바 동시성-조건 인터페이스

java.util.concurrent.locks.Condition 인터페이스는 주어진 조건이 참이 될 때까지 실행을 일시 중단하는 스레드 기능을 제공합니다. Condition 객체는 반드시 Lock에 바인딩되며 newCondition () 메서드를 사용하여 가져옵니다.

조건 방법

다음은 Condition 클래스에서 사용할 수있는 중요한 메서드 목록입니다.

Sr. 아니. 방법 및 설명
1

public void await()

현재 스레드가 신호를 받거나 중단 될 때까지 대기하도록합니다.

2

public boolean await(long time, TimeUnit unit)

현재 스레드가 신호를 받거나 인터럽트되거나 지정된 대기 시간이 경과 할 때까지 대기하도록합니다.

public long awaitNanos(long nanosTimeout)

현재 스레드가 신호를 받거나 인터럽트되거나 지정된 대기 시간이 경과 할 때까지 대기하도록합니다.

4

public long awaitUninterruptibly()

현재 스레드가 신호를받을 때까지 대기하도록합니다.

5

public long awaitUntil()

현재 스레드가 신호를 받거나 인터럽트되거나 지정된 기한이 경과 할 때까지 대기하도록합니다.

6

public void signal()

대기중인 스레드 하나를 깨 웁니다.

7

public void signalAll()

대기중인 모든 스레드를 깨 웁니다.

다음 TestThread 프로그램은 Condition 인터페이스의 이러한 메소드를 보여줍니다. 여기서는 signal ()을 사용하여 알림을 보내고 await ()를 사용하여 스레드를 일시 중지했습니다.

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class TestThread {

   public static void main(String[] args) throws InterruptedException {
      ItemQueue itemQueue = new ItemQueue(10);

      //Create a producer and a consumer.
      Thread producer = new Producer(itemQueue);
      Thread consumer = new Consumer(itemQueue);

      //Start both threads.
      producer.start();
      consumer.start();

      //Wait for both threads to terminate.
      producer.join();
      consumer.join();
   }

   static class ItemQueue {
      private Object[] items = null;
      private int current = 0;
      private int placeIndex = 0;
      private int removeIndex = 0;

      private final Lock lock;
      private final Condition isEmpty;
      private final Condition isFull;

      public ItemQueue(int capacity) {
         this.items = new Object[capacity];
         lock = new ReentrantLock();
         isEmpty = lock.newCondition();
         isFull = lock.newCondition();
      }

      public void add(Object item) throws InterruptedException {
         lock.lock();

         while(current >= items.length)
            isFull.await();

         items[placeIndex] = item;
         placeIndex = (placeIndex + 1) % items.length;
         ++current;

         //Notify the consumer that there is data available.
         isEmpty.signal();
         lock.unlock();
      }

      public Object remove() throws InterruptedException {
         Object item = null;

         lock.lock();

         while(current <= 0) {
            isEmpty.await();
         }
         item = items[removeIndex];
         removeIndex = (removeIndex + 1) % items.length;
         --current;

         //Notify the producer that there is space available.
         isFull.signal();
         lock.unlock();

         return item;
      }

      public boolean isEmpty() {
         return (items.length == 0);
      }
   }

   static class Producer extends Thread {
      private final ItemQueue queue;
      
      public Producer(ItemQueue queue) {
         this.queue = queue;
      }

      @Override
      public void run() {
         String[] numbers =
            {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"};

         try {
            
            for(String number: numbers) {
               System.out.println("[Producer]: " + number);
            }
            queue.add(null);
         } catch (InterruptedException ex) {
            ex.printStackTrace();
         } 
      }
   }

   static class Consumer extends Thread {
      private final ItemQueue queue;
      
      public Consumer(ItemQueue queue) {
         this.queue = queue;
      }

      @Override
      public void run() {
         
         try {
            
            do {
               Object number = queue.remove();
               System.out.println("[Consumer]: " + number);

               if(number == null) {
                  return;
               }
            } while(!queue.isEmpty());
         } catch (InterruptedException ex) {
            ex.printStackTrace();
         }
      }
   }
}

그러면 다음과 같은 결과가 생성됩니다.

산출

[Producer]: 1
[Producer]: 2
[Producer]: 3
[Producer]: 4
[Producer]: 5
[Producer]: 6
[Producer]: 7
[Producer]: 8
[Producer]: 9
[Producer]: 10
[Producer]: 11
[Producer]: 12
[Consumer]: null