美文网首页
java并发编程:顺序输出A、B、C循环10次

java并发编程:顺序输出A、B、C循环10次

作者: sunny4handsome | 来源:发表于2017-12-10 16:40 被阅读0次

要求:3个线程,分别输出A、B、C。循环10次,给出三种方法,code如下

wait、notify

public class PrintABC {  
    static int state = 0;  
    private static Object o = new Object();  
    public static void main(String[] args) {  
        ExecutorService ser = Executors.newCachedThreadPool();  
        ser.submit(new ThreadA());  
        ser.submit(new ThreadB());  
        ser.submit(new ThreadC());  
          
        ser.shutdown();  
    }  
  
    public static class ThreadA implements Runnable {  
  
        @Override  
        public void run() {  
              
                for(int i=0;i<10;i++){  
                    synchronized (o) {  
                        while(state%3!=0){  
                            try {  
                                o.wait();  
                            } catch (InterruptedException e) {  
                                e.printStackTrace();  
                            }  
                        }  
                        System.out.println("A");  
                        state++;  
                        o.notifyAll();  
                    }  
                      
            }  
        }  
  
    }  
  
    public static class ThreadB implements Runnable {  
        @Override  
        public void run() {  
            for(int i=0;i<10;i++){  
                synchronized (o) {  
                    while(state%3!=1){  
                        try {  
                            o.wait();  
                        } catch (InterruptedException e) {  
                            e.printStackTrace();  
                        }  
                    }  
                    System.out.println("B");  
                    state++;  
                    o.notifyAll();  
                }  
            }  
        }  
  
    }  
  
    public static class ThreadC implements Runnable {  
        @Override  
        public void run() {  
            for(int i=0;i<10;i++){  
                synchronized (o) {  
                    while(state%3!=2){  
                        try {  
                            o.wait();  
                        } catch (InterruptedException e) {  
                            e.printStackTrace();  
                        }  
                    }  
                    System.out.println("C");  
                    state++;  
                    o.notifyAll();  
                }  
            }  
        }  
  
    }  
}  

lock、unlock

public class PrintABC2 {  
    static int state = 0;  
    private static Lock lock = new ReentrantLock();  
    public static void main(String[] args) {  
        ExecutorService ser = Executors.newCachedThreadPool();  
        ser.submit(new ThreadA());  
        ser.submit(new ThreadB());  
        ser.submit(new ThreadC());  
          
        ser.shutdown();  
    }  
  
    public static class ThreadA implements Runnable {  
  
        @Override  
        public void run() {  
                  
                for(int i=0;i<10;){  
                    lock.lock();  
                    if(state%3==0){  
                        System.out.println("A");  
                        state++;  
                        i++;  
                    }  
                    lock.unlock();  
                }  
                      
            }  
        }  
  
      
  
    public static class ThreadB implements Runnable {  
        @Override  
        public void run() {  
            for(int i=0;i<10;){  
                lock.lock();  
                if(state%3==1){  
                    System.out.println("B");  
                    state++;  
                    i++;  
                }  
                lock.unlock();  
            }  
        }  
  
    }  
  
    public static class ThreadC implements Runnable {  
        @Override  
        public void run() {  
            for(int i=0;i<10;){  
                lock.lock();  
                if(state%3==2){  
                    System.out.println("C");  
                    state++;  
                    i++;  
                }  
                lock.unlock();  
            }  
        }  
  
    }  
}  

信号量

public class PrintABC3 {  
    static int state = 0;  
     private static Semaphore A = new Semaphore(1);  
     private static Semaphore B = new Semaphore(1);  
     private static Semaphore C = new Semaphore(1);  
    public static void main(String[] args) {  
        ExecutorService ser = Executors.newCachedThreadPool();  
        try {  
            B.acquire();  
            C.acquire();  
        } catch (InterruptedException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
      
        ser.submit(new ThreadA());  
        ser.submit(new ThreadB());  
        ser.submit(new ThreadC());  
          
        ser.shutdown();  
    }  
          static class ThreadA extends Thread {  
        
            @Override  
             public void run() {  
                 try {  
                     for (int i = 0; i < 10; i++) {  
                        A.acquire();  
                         System.out.print("A");  
                         sleep(2000);  
                         B.release();  
                     }  
                 } catch (InterruptedException e) {  
                     e.printStackTrace();  
                 }  
             }  
               
         }  
          
         static class ThreadB extends Thread {  
       
             @Override  
             public void run() {  
                 try {  
                     for (int i = 0; i < 10; i++) {  
                        B.acquire();  
                         System.out.print("B");  
                         C.release();  
                     }  
                 } catch (InterruptedException e) {  
                     e.printStackTrace();  
                 }  
             }  
               
         }  
           
         static class ThreadC extends Thread {  
         @Override  
         public void run() {  
             try {  
                 for (int i = 0; i < 10; i++) {  
                    C.acquire();  
                     System.out.print("C");  
                     A.release();  
                 }  
             } catch (InterruptedException e) {  
                 e.printStackTrace();  
             }  
         }  
           
         }  
      
}  

结果如下:

A  
B  
C  
A  
B  
C  
A  
B  
C  
A  
B  
C  
A  
B  
C  
A  
B  
C  
A  
B  
C  
A  
B  
C  
A  
B  
C  
A  
B  
C  

相关文章

网友评论

      本文标题:java并发编程:顺序输出A、B、C循环10次

      本文链接:https://www.haomeiwen.com/subject/dfjvixtx.html