3 Threads Printing numbers in sequence

前端 未结 14 1525
不思量自难忘°
不思量自难忘° 2021-02-05 23:45

I am trying to write a simple code to print numbers in sequence. Scenario is like

Thread  Number
T1        1
T2        2
T3        3
T1        4
T2        5
T3          


        
14条回答
  •  甜味超标
    2021-02-06 00:03

    Below code uses the logic of notifying the next thread to print the number and then incrementing it by 1 and then again notifying the next thread and then go in wait state till some thread notifies it. Eg. T1 first prints the value and then makes boolean "second" true for T2 to print the next number. T2 after printing the number makes boolean "third" true for T3. T3 does the same thing by making boolean "first" true for T1 to print the next number.

    T1 -> T2 -> T3 -> T1 -> T2 -> T3 -> ........ and so on.

    public class Test{
      public static volatile int i = 0;
      public static void main(String[] args) throws InterruptedException {
        Object monitor = new Object();
        Notifier notifier = new Notifier(monitor);
        Thread thread1 = new Thread(notifier, "T1");
        Thread thread2 = new Thread(notifier, "T2");
        Thread thread3 = new Thread(notifier, "T3");
        thread1.start();
        thread2.start();
        thread3.start();
      }
    }
    
    
    
    class Notifier implements Runnable {
    
      private Object monitor = null;
      private static int i = 1;
      private static boolean first = true;
      private static boolean second = false;
      private static boolean third = false;
    
      public Notifier(Object objcurr) {
        this.monitor = objcurr;
      }
    
      @Override
      public void run() {
        try {
          while (true) {
            synchronized (monitor) {
              String Tname = Thread.currentThread().getName();
              if (first && Tname.equalsIgnoreCase("T1")) {
                print();
                first = false;
                second = true;
                monitor.notifyAll();
                monitor.wait();
              } else if (second && Tname.equalsIgnoreCase("T2")) {
                print();
                second = false;
                third = true;
                monitor.notifyAll();
                monitor.wait();
              } else if (third && Tname.equalsIgnoreCase("T3")) {
                print();
                third = false;
                first = true;
                monitor.notifyAll();
                monitor.wait();
              } else {
                monitor.wait();
              }
            }
            Thread.sleep(1000);
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    
      private void print() {
        System.out.println(Thread.currentThread().getName() + " - " + Notifier.i++);
      }
    

提交回复
热议问题