Odd even number printing using thread

前端 未结 13 2041
挽巷
挽巷 2020-11-29 08:39

Odd even number printing using thread.Create one thread class, two instance of the thread. One will print the odd number and the other will print the even number.

13条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-29 09:32

    The same can be solved using Lock interface:

    NaturalOrder.java

    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class NaturalOrder {
    
        public int currentNumber = 1;
        public boolean evenOdd = false;
    
        Lock lock = new ReentrantLock();
        Condition condition = lock.newCondition();
    
        public static void main(String[] args) {
            NaturalOrder naturalOrder = new NaturalOrder();
            Thread t1 = new Thread(new OddNumberLock(naturalOrder, naturalOrder.lock, naturalOrder.condition));
            Thread t2 = new Thread(new EvenNumberLock(naturalOrder, naturalOrder.lock, naturalOrder.condition));
            t1.start();
            t2.start();
        }
    }
    

    OddNumberLock.java

    import java.util.concurrent.ThreadLocalRandom;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    
    public class OddNumberLock implements Runnable {
    
        NaturalOrder naturalOrder;
        Lock lock;
        Condition condition;
    
        public OddNumberLock(NaturalOrder naturalOrder, Lock lock, Condition condition) {
            this.naturalOrder = naturalOrder;
            this.lock = lock;
            this.condition = condition;
        }
    
        @Override
        public void run() {
            lock.lock();
            while (naturalOrder.currentNumber < 20) {
                while (naturalOrder.evenOdd != false) {
                    try {
                        condition.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
                try {
                    Thread.sleep(ThreadLocalRandom.current().nextInt(1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (naturalOrder.currentNumber % 2 != 0) {
                    System.out.println(naturalOrder.currentNumber);
                }
                naturalOrder.currentNumber++;
                naturalOrder.evenOdd = true;
    
                condition.signalAll();
            }
            lock.unlock();
        }
    }
    

    EvenNumberLock.java

    import java.util.concurrent.ThreadLocalRandom;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    
    public class EvenNumberLock implements Runnable {
    
        NaturalOrder naturalOrder;
        Lock lock;
        Condition condition;
    
        public EvenNumberLock(NaturalOrder naturalOrder, Lock lock, Condition condition) {
            this.naturalOrder = naturalOrder;
            this.lock = lock;
            this.condition = condition;
        }
    
        @Override
        public void run() {
            lock.lock();
            while (naturalOrder.currentNumber < 20) {
                while (naturalOrder.evenOdd != true) {
                    try {
                        condition.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
                try {
                    Thread.sleep(ThreadLocalRandom.current().nextInt(1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                if (naturalOrder.currentNumber % 2 == 0) {
                    System.out.println(naturalOrder.currentNumber);
                }
                naturalOrder.currentNumber++;
                naturalOrder.evenOdd = false;
                condition.signalAll();
            }
            lock.unlock();
        }
    }
    

提交回复
热议问题