Inter Thread Communication Inwards Coffee Using Await Notify Example

Wait together with notify methods inward Java are used for inter-thread communication i.e. if 1 thread wants to state something to roughly other thread, it uses notify() and notifyAll() method of java.lang.Object. Classical representative of hold off together with notify method is Producer Consumer pattern pattern, where One thread create together with lay something on shared bucket, together with and then state other thread that at that spot is an special for your involvement inward shared object, consumer thread than alternative than special together with do his job, without wait() together with notify(), consumer thread needs to move busy checking, fifty-fifty if at that spot is no modify inward state of shared object.

This brings an interesting indicate on using hold off together with notify mechanism, a telephone telephone to notify() happens, when thread changed state of shared object i.e. inward this instance producer modify bucket from empty to non empty, together with consumer modify state from non-empty to empty.

Also wait together with notify method must move called from synchronized context, wondering why, read this link for roughly reasons which makes sense. Another of import affair to choke on inward remove heed spell calling them is, using loop to banking enterprise fit weather instead of if block.

This is actually tricky for beginners, which oftentimes don't empathise divergence together with wonders why hold off together with notify acquire called shape loops. Joshua Bloch has a real informative special on his mass Effective Java, I strongly advise reading that.

In short, a waiting thread may woke up, without whatsoever modify inward it's waiting status due to spurious wake up.

For example, if a consumer thread, which is waiting because shared queue is empty, gets wake upward due to a simulated alert together with endeavour to acquire something from queue without farther checking whether queue is empty or non than unexpected number is possible.

Here is criterion idiom for calling wait, notify together with notifyAll methods inward Java :




How to telephone telephone hold off method inward Java :

synchronized (object) {
         while ()
             object.wait();
         ... // Perform activity appropriate to condition
 }

together with hither is consummate representative of calling hold off together with notify method inward Java using ii threads, producer together with consumer

 Wait together with notify methods inward Java are used for inter Inter Thread Communication inward Java using Wait Notify Example


Java Inter Thread Communication Example - Wait together with Notify

 Wait together with notify methods inward Java are used for inter Inter Thread Communication inward Java using Wait Notify Exampletwo threads called Producer and Consumer. Producer thread puts number into shared queue together with Consumer thread consumes numbers from shared bucket. Condition is that 1 time an special is produced, consumer thread has to move notified together with similarly afterward consumption producer thread needs to move notified. This inter thread communication is achieved using hold off together with notify method. Remember wait together with notify method is defined inward object class, together with they are must move called within synchronized block.

package concurrency;
import java.util.LinkedList;
import java.util.Queue;
import org.apache.log4j.Logger;

public class InterThreadCommunicationExample {

    public static void main(String args[]) {

        final Queue sharedQ = new LinkedList();

        Thread producer = new Producer(sharedQ);
        Thread consumer = new Consumer(sharedQ);

        producer.start();
        consumer.start();

    }
}

public class Producer extends Thread {
    private static final Logger logger = Logger.getLogger(Producer.class);
    private final Queue sharedQ;

    public Producer(Queue sharedQ) {
        super("Producer");
        this.sharedQ = sharedQ;
    }

    @Override
    public void run() {

        for (int i = 0; i < 4; i++) {

            synchronized (sharedQ) {
                //waiting status - hold off until Queue is non empty
                while (sharedQ.size() >= 1) {
                    try {
                        logger.debug("Queue is full, waiting");
                        sharedQ.wait();
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
                logger.debug("producing : " + i);
                sharedQ.add(i);
                sharedQ.notify();
            }
        }
    }
}

public class Consumer extends Thread {
    private static final Logger logger = Logger.getLogger(Consumer.class);
    private final Queue sharedQ;

    public Consumer(Queue sharedQ) {
        super("Consumer");
        this.sharedQ = sharedQ;
    }

    @Override
    public void run() {
        while(true) {

            synchronized (sharedQ) {
                //waiting status - hold off until Queue is non empty
                while (sharedQ.size() == 0) {
                    try {
                        logger.debug("Queue is empty, waiting");
                        sharedQ.wait();
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
                int number = sharedQ.poll();
                logger.debug("consuming : " + number );
                sharedQ.notify();
              
                //termination condition
                if(number == 3){break; }
            }
        }
    }
}

Output:
05:41:57,244 0    [Producer] DEBUG concurrency.Producer  - producing : 0
05:41:57,260 16   [Producer] DEBUG concurrency.Producer  - Queue is full, waiting
05:41:57,260 16   [Consumer] DEBUG concurrency.Consumer  - consuming : 0
05:41:57,260 16   [Consumer] DEBUG concurrency.Consumer  - Queue is empty, waiting
05:41:57,260 16   [Producer] DEBUG concurrency.Producer  - producing : 1
05:41:57,260 16   [Producer] DEBUG concurrency.Producer  - Queue is full, waiting
05:41:57,260 16   [Consumer] DEBUG concurrency.Consumer  - consuming : 1
05:41:57,260 16   [Consumer] DEBUG concurrency.Consumer  - Queue is empty, waiting
05:41:57,260 16   [Producer] DEBUG concurrency.Producer  - producing : 2
05:41:57,260 16   [Producer] DEBUG concurrency.Producer  - Queue is full, waiting
05:41:57,260 16   [Consumer] DEBUG concurrency.Consumer  - consuming : 2
05:41:57,260 16   [Consumer] DEBUG concurrency.Consumer  - Queue is empty, waiting
05:41:57,260 16   [Producer] DEBUG concurrency.Producer  - producing : 3
05:41:57,276 32   [Consumer] DEBUG concurrency.Consumer  - consuming : 3

That's all on this elementary representative of Inter thread communication inward Java using hold off together with notify method. You tin plough over notice run into that both Producer together with Consumer threads are communicating amongst each other together with sharing information using shared Queue, Producer notifies consumer when at that spot is an special create for consumption together with Consumer thread tells Producer 1 time it's done amongst consuming. This is classical representative of Producer Consumer pattern pattern equally well, which inherently involves inter-thread communication together with information sharing betwixt threads inward Java.


Further Learning
Multithreading together with Parallel Computing inward Java
Java Concurrency inward Practice - The Book
Applying Concurrency together with Multi-threading to Common Java Patterns
Java Concurrency inward Practice Course yesteryear Heinz Kabutz



Sumber https://javarevisited.blogspot.com/

0 Response to "Inter Thread Communication Inwards Coffee Using Await Notify Example"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel