3 Threads Printing numbers in sequence

前端 未结 14 1495
不思量自难忘°
不思量自难忘° 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:07

    Bad way to do but ask is to implement using multiple threads:

    private static AtomicInteger currentThreadNo = new AtomicInteger(0);
        private static int currentNo = 1;
        private static final Object lock = new Object();
    

    Above, these values are static so that they remain same for all the worker objects.

    import java.util.concurrent.atomic.AtomicInteger;
    
    public class PrintNumbersUsingNThreads implements Runnable {
    
        private final int threadNo;
        private final int totalThreads;
        private static AtomicInteger currentThreadNo = new AtomicInteger(0);
        private static int currentNo = 1;
        private static final Object lock = new Object();
    
    
        public PrintNumbersUsingNThreads(int threadNo, int totalThreads) {
            this.threadNo = threadNo;
            this.totalThreads = totalThreads;
        }
    
        @Override
        public  void run() {
    
    
    
            while (true) {
                while (currentThreadNo.get() % totalThreads != threadNo) {
                    try {
    
                        synchronized (lock) {
                            lock.wait();
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName() + " printing " + currentNo);
                currentNo++;
    
                int curr = currentThreadNo.get();
                if (curr == totalThreads) {
                    currentThreadNo.set(1);
                } else {
                   currentThreadNo.incrementAndGet();
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock) {
                    lock.notifyAll();
                }
            }
    
        }
    
        public static void main(String[] args) {
            int totalThreads = 3;
    
            for(int i = 0; i < totalThreads; i++){
                new Thread(new PrintNumbersUsingNThreads(i,totalThreads),"thread"+i).start();
            }
    
        }
    }
    

    output:

    thread0 printing 1
    thread1 printing 2
    thread2 printing 3
    thread0 printing 4
    thread1 printing 5
    thread2 printing 6
    thread0 printing 7
    thread1 printing 8
    thread2 printing 9
    thread0 printing 10
    thread1 printing 11
    thread2 printing 12
    thread0 printing 13
    thread1 printing 14
    thread2 printing 15
    thread0 printing 16
    thread1 printing 17
    thread2 printing 18
    

提交回复
热议问题