面试题--三个线程循环打印ABC10次的几种解决方法-Semaphore(4)

113 阅读1分钟

面试题--三个线程循环打印ABC10次的几种解决方法-Semaphore(4)

package com.ces.myThread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoresExample {
    Semaphore semaphoreA = new Semaphore(1);
    Semaphore semaphoreB = new Semaphore(0);
    Semaphore semaphoreC = new Semaphore(0);

    private class ThreadA implements Runnable {

        @Override
        public void run() {
            for (int i = 0; i < 3; i++) {
                try {
                    semaphoreA.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.print("A");

                semaphoreB.release();
            }
        }
    }

    private class ThreadB implements Runnable {

        @Override
        public void run() {
            for (int i = 0; i < 3; i++) {
                try {
                    semaphoreB.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.print("B");

                semaphoreC.release();
            }
        }
    }


    private class ThreadC implements Runnable {

        @Override
        public void run() {
            for (int i = 0; i < 3; i++) {
                try {
                    semaphoreC.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("C");

                semaphoreA.release();
            }
        }
    }

    public static void main(String[] args) {
        SemaphoresExample semaphoresExample=new SemaphoresExample();
        ExecutorService executorService= Executors.newFixedThreadPool(3);
        executorService.submit(semaphoresExample.new ThreadA());
        executorService.submit(semaphoresExample.new ThreadB());
        executorService.submit(semaphoresExample.new ThreadC());
        executorService.shutdown();
    }
}