running 3 threads in sequence java

前端 未结 10 618
天涯浪人
天涯浪人 2020-11-29 04:35

I have 3 threads 1st printing A 2nd printing B 3rd printing C

I want to print in sequence A B C A B C A B C and so on.....

So I wrote the program below, but

10条回答
  •  情话喂你
    2020-11-29 05:19

    Here is my solution -

    I have created three threads each thread knows what it needs to print and what comes after it.

    I have also created a Class NLock which holds the next word which needs to be printed.

    Whenever a thread is able to acquire NLock lock then it checks if it's his turn if yes then it prints the word and set the next value to be printed in NLock or else it waits till it's his turn

    public class SynchronizeThreeThreads {
    
        public static void main(String args[]) throws InterruptedException {
            NLock lock=new NLock("A");
            Thread a =new Thread(new PrintInOrder("A","B",lock));
            Thread b =new Thread(new PrintInOrder("B","C",lock));
            Thread c =new Thread(new PrintInOrder("C","A",lock));
    
            a.start();
            b.start();
            c.start();
            c.join(); // Once all is done main thread will exit
            System.out.println("Done");
        }
    }
    
    class NLock{
         private String value;
    
         public NLock(String value) {
             this.value=value;
         }
    
         public String getValue() {
             return value;
         }
    
         public void setValue(String next) {
             this.value=next;
         }
    
    }
    
    class PrintInOrder implements Runnable{
    
        private String word;
    
        private String next;
    
        private NLock lock;
    
        public PrintInOrder(String word, String next,NLock lock){
            this.word=word;
            this.next=next;
            this.lock=lock;
        }
    
        @Override
        public void run() {
            int i=0;
            while(i<3) {
                synchronized (lock) {
                    try {
                        //Check if it's my turn
                        if(lock.getValue().equals(word)) {
                            System.out.println(this.word);
                            //Set what next needs to be printed
                            //So that when that thread wakes up it knows that it's his turn
                            lock.setValue(next);
                            i++;
                            lock.notifyAll();
                            Thread.sleep(100);
                        }
                        else //Nope not my turn wait
                            lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
            }
        }
    }
    

    Below is the output

    A B C A B C A B C Done

提交回复
热议问题