running 3 threads in sequence java

前端 未结 10 605
天涯浪人
天涯浪人 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:26

        public class Main {
            public static void main(String[] args) throws IOException{
            Thread t1 = new Thread(new A(), "1");
            Thread t2 = new Thread(new A(), "2");
            Thread t3 = new Thread(new A(), "3");
    
            t1.start();
            try{
                t1.join();
            }catch (Exception e){
    
            }
            t2.start();
            try{
                t2.join();
            }catch (Exception e){
    
            }
            t3.start();
            try{
                t3.join();
            }catch (Exception e){
    
            }
    
    
        }
    }
    
        class A implements Runnable{
        public void run(){
            System.out.println(Thread.currentThread().getName());
        }
    }
    

    or you can use Executor Framework

    public class Sequence {
        int valve = 1;
        public static void main(String[] args){
            Sequence s = new Sequence();
            ExecutorService es = Executors.newFixedThreadPool(3);
    
            List rList = new ArrayList<>();
            rList.add(new A(s));
            rList.add(new B(s));
            rList.add(new C(s));
    
            for(int i = 0; i < rList.size(); i++){
                es.submit(rList.get(i));
            }
            es.shutdown();
    
        }
    }
    
    class A implements Runnable{
        Sequence s;
    
        A(Sequence s){
            this.s = s;
        }
    
        public void run(){
            synchronized (s) {
                for (int i = 0; i < 10; i++) {
                    while (s.valve != 1) {
                        try {
                            s.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("A");
                    s.valve = 2;
                    s.notifyAll();
                }
            }
        }
    }
    
    class B implements Runnable{
        Sequence s;
    
        B(Sequence s){
            this.s = s;
        }
    
        public void run() {
            synchronized (s) {
                for (int i = 0; i < 10; i++) {
                    while (s.valve != 2) {
                        try {
                            s.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("B");
                    s.valve = 3;
                    s.notifyAll();
                }
            }
        }
    }
    
    class C implements Runnable{
        Sequence s;
    
        C(Sequence s){
            this.s = s;
        }
    
        public void run() {
            synchronized (s) {
                for(int i = 0; i < 10; i++) {
                    while (s.valve != 3) {
                        try {
                            s.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("C");
                    s.valve = 1;
                    s.notifyAll();
                }
            }
        }
    }
    

    In the first case the join for each thread causes the threads to wait for one another. In the second case a list stores the threads and executor executes them one after another creating 3 threads

    Another way to do this is where only one runnable class is present and communication between thread is done via static variable in the main class and a variable in the runnable class

    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.Executor;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Seq {
        int i = 1;
        public static void main(String[] args){
            Seq s = new Seq();
            Common c1 = new Common(s, 1);
            Common c2 = new Common(s, 2);
            Common c3 = new Common(s, 3);
    
            List l = new ArrayList<>();
            l.add(c1);
            l.add(c2);
            l.add(c3);
    
            ExecutorService es = Executors.newFixedThreadPool(3);
            for(int i = 0; i < 3; i++){
                es.submit(l.get(i));
            }
            es.shutdown();
        }
    }
    
    class Common implements Runnable{
        Seq s;
        int o;
    
        Common(Seq s, int o){
            this.s = s;
            this.o = o;
        }
    
        public void run(){
            synchronized (s) {
                for (int z = 0; z < 100; z++) {
                    if(s.i > 3)
                        s.i = 1;
                    while (s.i != o) {
                        try {
                            s.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(o);
                    s.i++;
                    s.notifyAll();
                }
            }
        }
    }
    

提交回复
热议问题