package ru.job4j.simpleBlockingQueue;

import javax.annotation.concurrent.GuardedBy;
import javax.annotation.concurrent.ThreadSafe;
import java.util.ArrayDeque;
import java.util.LinkedList;
import java.util.Queue;

@ThreadSafe
public class SimpleBlockingQueue {

    private final Object lock = new Object();

    @GuardedBy("this")
    private Queue<Integer> queue = new LinkedList<>();

    //Вставляет элемент в конец очереди
    public void offer(int value) {
        queue.offer(value);
    }

    // возвращает и удаляет головной элемент
    public int poll() {
        return queue.poll();
    }

    public void doSomething() throws InterruptedException {
        synchronized (this.lock) {
            if (queue.peek()==null) {
                offer(0);
                lock.wait();
            }
        }
    }

    public void changeBlock() {
        synchronized (this.lock) {
            if (queue.peek()!=null) {
                poll();
            }
            lock.notify();
        }
    }

    public static void main (String[] args) throws InterruptedException {

        // producer блокирует если очередь заполнена
        // до тех пор пока Cunsomer не извлечет данные из очередиы
        final SimpleBlockingQueue sbq = new SimpleBlockingQueue();

        //customer
        Thread cunsomer =  new Thread() {
            @Override
            public void run() {
                try {
                    sbq.doSomething();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        //producer
        Thread producer = new Thread() {
            @Override
            public void run() {
                sbq.changeBlock();
            }
        };

        cunsomer.start();
        producer.start();

    }

}

@@ -31,17 +31,16 @@
 gQueue;%0A
-%0A
 import j
@@ -128,37 +128,8 @@
 fe;%0A
-import java.util.ArrayDeque;%0A
 impo
@@ -222,16 +222,19 @@
 ingQueue
+%3CT%3E
  %7B%0A%0A    
@@ -315,21 +315,21 @@
 ate 
-Queue%3CInteger
+final Queue%3CT
 %3E qu
@@ -402,24 +402,37 @@
 %0A    public 
+synchronized 
 void offer(i
@@ -430,19 +430,17 @@
 d offer(
-int
+T
  value) 
@@ -449,16 +449,21 @@
         
+this.
 queue.of
@@ -537,19 +537,30 @@
  public 
-int
+synchronized T
  poll() 
@@ -573,15 +573,24 @@
     
+   
+ 
 return 
+this.
 queu
@@ -599,24 +599,29 @@
 poll();%0A    
+   
+  
 %7D%0A%0A    publi
@@ -639,16 +639,23 @@
 mething(
+T value
 ) throws
@@ -777,9 +777,13 @@
 fer(
-0
+value
 );%0A 
@@ -848,24 +848,37 @@
 %0A    public 
+synchronized 
 void changeB
@@ -975,16 +975,21 @@
         
+this.
 poll();%0A
@@ -1482,16 +1482,17 @@
 mething(
+1
 );%0A     

task #187595