/* Problem Statement- Call in
order...
 * threadA calling first(), threadB calling
second()
 * and threadC calling third() 
 */
Summary - Even if thread2/thread3 enters run() , they will relinquish the lock and thread1 would be the first who at last pick the lock and satisfy the condition and make other threads to proceed accordingly
import
java.util.concurrent.atomic.AtomicInteger;
class Foo implements Runnable {
     AtomicInteger count=new
AtomicInteger(1);
     public final static Object obj = new Object();
     public void first() {
          System.out.println("*******First
Method called by*****" + Thread.currentThread().getName());
     }
     public void second() {
          System.out.println("*******Second
Method called by******" + Thread.currentThread().getName());
     }
     public void third() {
          System.out.println("*******Third
Method called by******" + Thread.currentThread().getName());
     }
     public void run() {
          synchronized (obj) {
              System.out.println("Lock
acquired by " + Thread.currentThread().getName());
              while (count.get() <= 3)
{
                   if (Thread.currentThread().getName().equals("Thread
A") && count.get() == 1) {
                        first();
                        count.incrementAndGet();
                        obj.notifyAll();
                   } else if (Thread.currentThread().getName().equals("Thread
B") && count.get() == 2) {
                        second();
                        count.incrementAndGet();
                        obj.notifyAll();
                   } else if (Thread.currentThread().getName().equals("Thread
C") && count.get() == 3) {
                        third();
                        count.incrementAndGet();
                        obj.notifyAll();
                   } else {
                        try {
                             System.out.println("Lock
released by " + Thread.currentThread().getName());
                             obj.wait();
                        } catch
(InterruptedException e) {
                             e.printStackTrace();
                        }
                   }
              }
          }
     }
}
public class CallInOrder {
     public static void main(String[] args) {
          Foo fooInst = new Foo();
          Thread threadA = new Thread(fooInst, "Thread
A");
          Thread threadB = new Thread(fooInst, "Thread
B");
          Thread threadC = new Thread(fooInst, "Thread
C");
          threadC.start();
          threadB.start();
          threadA.start();
     }
}
Output
Lock
acquired by Thread C
Lock
released by Thread C
Lock
acquired by Thread B
Lock
released by Thread B
Lock
acquired by Thread A
*******First
Method called by*****Thread A
Lock
released by Thread A
*******Second
Method called by******Thread B
Lock
released by Thread B
*******Third
Method called by******Thread C
Thank you for taking the time to provide us with your valuable information. We strive to provide our candidates with excellent care
ReplyDeletehttp://chennaitraining.in/qliksense-training-in-chennai/
http://chennaitraining.in/pentaho-training-in-chennai/
http://chennaitraining.in/machine-learning-training-in-chennai/
http://chennaitraining.in/artificial-intelligence-training-in-chennai/
http://chennaitraining.in/snaplogic-training-in-chennai/
http://chennaitraining.in/snowflake-training-in-chennai/