How to make sure two threads printing even odd numbers maintain even first then odd order for this implementation?

后端 未结 3 1598
独厮守ぢ
独厮守ぢ 2021-01-16 01:24

I have created two runnable jobs: PrintEvenNumbersJob and PrintOddNumbersJob and spawned two threads to execute these jobs. This seems to work perfectly fine! But I smell so

3条回答
  •  渐次进展
    2021-01-16 01:47

    I believe you will need a referee:

    public class Referee {
        private boolean evensTurn = true;
    
        public void waitMyTurn(boolean even) {
            synchronized(this) {
                while (even != evensTurn) {
                    try {
                        wait();
                    } finally {
                    }
                }
            }
        }
    
        public void done() {
            synchronized(this) {
                evensTurn = !evensTurn;
                notify();
            }
        }
    }
    
    public class PrintEvenNumbersJob implements Runnable {
    
        private Referee referee;
    
        public PrintEvenNumbersJob(Referee referee) {
            this.referee = referee;
        }
    
        @Override
        public void run() {
            for (int i = 0; i <= 10; i += 2) {
    
                referee.waitMyTurn(true);
    
                System.out.println(i);
    
                referee.done();
            }
        }
    }
    
    public class PrintOddNumbersJob implements Runnable {
    
        private Referee referee;
    
        public PrintOddNumbersJob(Referee referee) {
            this.referee = referee;
        }
    
        @Override
        public void run() {
            for (int i = 0; i <= 10; i += 2) {
    
                referee.waitMyTurn(false);
    
                System.out.println(i);
    
                referee.done();
            }
        }
    }
    

提交回复
热议问题