Writing a program with 2 threads which prints alternatively

后端 未结 14 1510
没有蜡笔的小新
没有蜡笔的小新 2020-12-31 20:47

I got asked this question recently in an interview.

Write a program with two threads (A and B), where A prints 1 , B prints 2 and so on until 50 is r

相关标签:
14条回答
  • 2020-12-31 21:18
    //simply use wait and notify and and set a counter and it will do  
    
    public class ThreadalternatePrint implements Runnable {
        static int counter =0; 
        @Override
        public synchronized void run() {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
    
            while(counter<51)
            {   ++counter;
            notify();
            System.out.println(Thread.currentThread().getName());
                try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }       
        }
    
        public static void main(String[] args) {
            ThreadalternatePrint obj1 = new ThreadalternatePrint();
            Thread Th1 = new Thread(obj1);
            Thread Th2 = new Thread(obj1);
            Th1.setName("Thread1");
            Th2.setName("Thread2");
            Th1.start();
            Th2.start();
        }
    
    
    }
    
    0 讨论(0)
  • 2020-12-31 21:19

    I encountered the same problem and was expected to use only basics so I choose wait notify on shared object between threads

    public class Message implements Runnable {
    
        private static final int N = 10;
        private Thread thread;
        private static Object object = new Object();
    
        public Message(String name){
            thread = new Thread(this, name);
            thread.start();
        }
    
        public void run(){
            for(int i=0; i<N; i++){
                synchronized (object) {
                    System.out.println(i + "--" + thread.getName());
                    object.notify();
                    try {
                        object.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                }
            }
        }
    }
    

    In main method :

    Message message1 = new Message("Ping");
    Message message2 = new Message("Pong");
    
    0 讨论(0)
  • 2020-12-31 21:26

    The essence of the assignment is to demonstrate how a thread can signal another one. Most common way is to use blocking queues, but here a signal does not carry any information, so a Semaphore is sufficient.

    Create thread class which is parameterized with 2 Semaphores: input and output:

    class ThreadPrinter implements Runnable {
        int counter;
        Semaphore ins, outs;
    
        ThreadPrinter(int counter, Semaphore ins, Semaphore outs) {
            this.counter = counter;
            this.ins = ins;
            this.outs = outs;
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 25; i++) {
                ins.aquire(); // wait for permission to run
                System.out.println("" + counter);
                outs.release();  // allow another thread to run
                counter += 2;
            }
        }
    

    Create 2 Semaphores and pass them to 2 threads:

    Semaphore a = new Semaphore(1);  // first thread is allowed to run immediately
    Semaphore b = new Semaphore(0); // second thread has to wait
    ThreadPrinter tp1 = new ThreadPrinter(1, a, b);
    ThreadPrinter tp2 = new ThreadPrinter(2, b, a); 
    

    Note semaphores a and b are passed in different order.

    0 讨论(0)
  • 2020-12-31 21:27

    I guess this might help. Although it is not standard but i hope it provides a simpler approach.

    public class ThreadDemo
    {
        public static void main (String [] args)
        {
            PrintDemo pd=new PrintDemo();     
            MyThread1 mt1 = new MyThread1 ("T1",pd);
            MyThread2 mt2 = new MyThread2 ("T2",pd);     
            mt1.start ();
            mt2.start();
        }
    }
    class PrintDemo {
        private boolean oddFlag=true;
        public synchronized void printOdd(int i,String tName){
            if(oddFlag==false){
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }   
            }else{
                System.out.println("\nThread "+tName+" count:"+i);
                oddFlag=false;
                notify();
            }
        }
        public synchronized void printEven(int i,String tName){
            if(oddFlag==true){
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }   
            }else{
                System.out.println("\nThread "+tName+" count:"+i);
                oddFlag=true;
                notify();
            }
        }   
    }
    class MyThread1 extends Thread
    {
        private PrintDemo pd;
        private String name;
    
        MyThread1(String threadName,PrintDemo pd){
            this.name=threadName;
            this.pd=pd;
        }  
        public void run ()  
        {
           for(int i=1;i<=50;i+=2){
                pd.printOdd(i,name);
           }
        }
    }
    class MyThread2 extends Thread
    {
        private PrintDemo pd;
        private String name;    
        MyThread2(String threadName,PrintDemo pd){
            this.name=threadName;
            this.pd=pd;
        }   
        public void run ()
        {
            for(int i=2;i<=50;i+=2){
                pd.printEven(i,name);                   
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-31 21:31
    public class PingPong extends Thread {
    static StringBuilder object = new StringBuilder("");
    
    public static void main(String[] args) throws InterruptedException {
    
        Thread t1 = new PingPong();
        Thread t2 = new PingPong();
    
        t1.setName("\nping");
        t2.setName(" pong");
    
        t1.start();
        t2.start();
    }
    
    @Override
    public void run() {
        working();
    }
    
    void working() {
        while (true) {
            synchronized (object) {
                try {
                    System.out.print(Thread.currentThread().getName());
                    object.notify();
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    }

    0 讨论(0)
  • 2020-12-31 21:33
    public class ThreadCounter implements Runnable {
        private static int count = 0;
    
        private Thread t;
    
        public ThreadCounter(String tName){
            t= new Thread(this, tName);
            t.start();
        }
    
        @Override
        public void run() {
            for(int i=1; i<=5; i++){
                synchronized (CommonUtil.mLock) {
                    incrementCount(t.getName());
                    CommonUtil.mLock.notify();
                    try {
                        CommonUtil.mLock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        private void incrementCount(String tName){
            System.out.println(tName+": "+(++ThreadCounter.count));
        }
    
        public static void main(String[] args) throws InterruptedException {
            new ThreadCounter("Thread1");
            Thread.sleep(500);
            new ThreadCounter("Thread2");
        }
    
    }
    
    class CommonUtil{
        public static Object mLock = new Object();
    }
    
    0 讨论(0)
提交回复
热议问题