In: Computer Science
Synchronize producer and consumer threads that use 10-item buffer for communication. Write pseudo code for both threads. Assume that you can use void Buffer::store(Item item) and Item Buffer::get() methods, but you need to explicitly ensure that you never store more than 10 items in the buffer (to prevent overflow).
In computing, the producer-consumer problem (also known as the bounded-buffer problem) is a classic example of a multi-process synchronization problem. The problem describes two processes, the producer and the consumer, which share a common, fixed-size buffer used as a queue.
Problem
To make sure that the producer won’t try to add data into the
buffer if it’s full and that the consumer won’t try to remove data
from an empty buffer.
Solution
The producer is to either go to sleep or discard data if the buffer
is full. The next time the consumer removes an item from the
buffer, it notifies the producer, who starts to fill the buffer
again. In the same way, the consumer can go to sleep if it finds
the buffer to be empty. The next time the producer puts data into
the buffer, it wakes up the sleeping consumer.
An inadequate solution could result in a deadlock where both
processes are waiting to be awakened.
import java.util.LinkedList;
public class Threadexample
{
    public
static void main(String[]
args)
        throws
InterruptedException
    {
        //
Object of a class that has both produce()
        //
and consume() methods
        final
PC pc = new PC();
        //
Create producer thread
        Thread
t1 = new Thread(new
Runnable() {
            @Override
            public
void run()
            {
                try
{
                    pc.produce();
                }
                catch
(InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        //
Create consumer thread
        Thread
t2 = new Thread(new
Runnable() {
            @Override
            public
void run()
            {
                try
{
                    pc.consume();
                }
                catch
(InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        //
Start both threads
        t1.start();
        t2.start();
        //
t1 finishes before t2
        t1.join();
        t2.join();
    }
    // This class has a
list, producer (adds items to list
    // and consumber
(removes items).
    public
static class PC {
        //
Create a list shared by producer and consumer
        //
Size of list is 2.
        LinkedList<Integer>
list = new
LinkedList<>();
        int
capacity = 2;
        //
Function called by producer thread
        public
void produce() throws
InterruptedException
        {
            int
value = 0;
            while
(true) {
                synchronized
(this)
                {
                    //
producer thread waits while list
                    //
is full
                    while
(list.size() == capacity)
                        wait();
                    System.out.println("Producer
produced-"
                                       +
value);
                    //
to insert the jobs in the list
                    list.add(value++);
                    //
notifies the consumer thread that
                    //
now it can start consuming
                    notify();
                    //
makes the working of program easier
                    //
to understand
                    Thread.sleep(1000);
                }
            }
        }
        //
Function called by consumer thread
        public
void consume() throws
InterruptedException
        {
            while
(true) {
                synchronized
(this)
                {
                    //
consumer thread waits while list
                    //
is empty
                    while
(list.size() == 0)
                        wait();
                    //
to retrive the ifrst job in the list
                    int
val = list.removeFirst();
                    System.out.println("Consumer
consumed-"
                                       +
val);
                    //
Wake up producer thread
                    notify();
                    //
and sleep
                    Thread.sleep(1000);
                }
            }
        }
    }
}
Important Points