Tuesday, September 24, 2013

Java thread wait notify alternate text print


package com.cisco;

import java.util.concurrent.locks.Lock;

public class Threads {

    private Object lock= new Object();
    private boolean flag = false;
    private Runnable thread1 ;
    private Runnable thread2 ;
    
    public static void main(String[] args) throws InterruptedException {
        Threads threads  = new Threads();
        threads.thread1 =  threads.new MyRunnable();
        threads.thread2 = threads.new MyRunnableT();
        Thread thread1 = new Thread(threads.thread1);
        Thread thread2 = new Thread(threads.thread2);
        thread1.start();
        thread2.start();
        try {
            thread1.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("thread 1 joined");
        thread2.join();
        System.out.println("end");
        
    }
    
    class MyRunnable implements Runnable {

        @Override
        public void run() {
            for (int i =0 ;i<10;i++){
            synchronized(lock){
                System.out.println("I have the lock" + Thread.currentThread().getName());
                try {
                    if(flag==false)
                    {// if flag == false you wait for it to be true
                        
                        lock.wait();
                        // do whatever you want
                        //s et flag to false
                        flag = false;
                        lock.notify();
                    }    
                    else {
                        // flag is true so do whatever you want and then set it to false
                        // do what ever you want 
                        flag= true;
                        lock.notify();
                        
                        }
                    } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                }
            }
        }
        
    }
    
    class MyRunnableT implements Runnable {

        @Override
        public void run() {
            for (int i =0 ;i<10;i++){
            synchronized(lock){
                System.out.println("I have the lock" + Thread.currentThread().getName());
                
                    if(flag==true)
                        {
                        // do what ever you want and then set the flag to true
                        // and then notify the other thread.
                        flag = false;
                        lock.notify();
                        
                        }
                    else {
                        // if flag is true you wait for it to be false
                        // then do whatever you want and then set it to true
                        try {
                            
                            // do whatever you want
                            flag = false;
                            lock.notify();
                            lock.wait();
                            
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                
                }
            }
        }
        
    }
}

No comments: