View difference between Paste ID: b5rkTEfc and b0tw8457
SHOW: | | - or go back to the newest paste.
1
package com.javatechie.multithreading;
2
3
import java.util.LinkedList;
4
import java.util.Queue;
5
import java.util.concurrent.locks.Condition;
6
import java.util.concurrent.locks.ReentrantLock;
7
8
/**
9
 * Consumer & Producer Example using lock and conditions
10
 **/
11
public class MyQueue<E> {
12
13
    Queue<E> myQueue = null;
14
    int max;
15
    ReentrantLock lock = new ReentrantLock();
16
    Condition notEmpty = lock.newCondition();
17
    Condition notFull = lock.newCondition();
18
19
    public MyQueue(int max) {
20
        this.myQueue = new LinkedList<>();
21
        this.max = max;
22
    }
23
24
    /**
25
     * Add element to queue
26
     **/
27
    public void addElement(E e) throws InterruptedException {
28
        lock.lock();
29
        try {
30
            //check if queue size is full then wait
31
            while (myQueue.size() == max) {
32
                notFull.await();
33
            }
34
            myQueue.add(e);
35
            //notify to other thread (consumer thread)
36
            notEmpty.signalAll();
37
        } finally {
38
            lock.unlock();
39
        }
40
    }
41
42
    /**
43
     * Get element from queue
44
     **/
45
    public E get() throws InterruptedException {
46
        lock.lock();
47
        try {
48
            //check if queue size is empty then wait
49
            while (myQueue.isEmpty()) {
50
                notEmpty.await();
51
            }
52
            E object = myQueue.remove();
53
            //notify to other thread (producer thread)
54
            notFull.signalAll();
55
            return object;
56
        } finally {
57
            lock.unlock();
58
        }
59
    }
60
}
61