인터뷰 질문 : 세 개의 스레드 ABC, 같은 ABCABC 같은 콘솔에 출력 시퀀스의 이름 .....

제목 :이 A, B, C라는 세 개의 스레드가 있고, 지금은 콘솔, 주문 ABCABC에 인쇄 된 이름을 정렬 할 필요가 ...

아이디어 :
당신이 스레드의 실행 순서를 제어하는 잠금 장치의 사용 + 조건 + ewait + signalAll 방법 있도록 원하기 때문에
실행 방법의 클래스 스레드 :

class ABC {

    private int num = 1;
    Lock lock = new ReentrantLock();
    // 每一个Condition控制一个线程,让它们有序的执行
    Condition condition1 = lock.newCondition();
    Condition condition2 = lock.newCondition();
    Condition condition3 = lock.newCondition();

    public  void lockA(){
        lock.lock();
        try {
            if(num!=1){
                try {
                    condition1.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName());
            num = 2;
            condition2.signalAll();
        } finally {
            lock.unlock();
        }
    }

    public  void lockB(){
        lock.lock();
        try {
            if(num!=2){
                try {
                    condition2.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName());
            num = 3;
            condition3.signalAll();
        } finally {
            lock.unlock();
        }
    }

    public  void lockC(){
        lock.lock();
        try {
            if(num!=3){
                try {
                    condition3.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName());
            num = 1;
            condition1.signalAll();
        }finally {
            lock.unlock();
        }
    }
}

Thread 클래스 :

class JymTestDemo implements Runnable{

    private ABC abc = new ABC();

    public void run() {
        if(Thread.currentThread().getName().equals("A")){
            for(int i =0;i<10;i++){
                abc.lockA();
            }
        }
        else if (Thread.currentThread().getName().equals("B")){
            for(int i =0;i<10;i++){
                abc.lockB();
            }
        }
        else if (Thread.currentThread().getName().equals("C")){
            for(int i =0;i<10;i++){
                abc.lockC();
            }
        }
    }

}

시험 방법 :

public class JymTest {
    public static void main(String[] args) {
        JymTestDemo jymTestDemo = new JymTestDemo();
        new Thread(jymTestDemo,"A").start();
        new Thread(jymTestDemo,"B").start();
        new Thread(jymTestDemo,"C").start();
    }
}

결과 :
그림 삽입 설명 여기

잘못 공부 시간의 부족, 너무 얕은 지식, 용서해주십시오.

세계에서 사람들이 10 종류가 있습니다, 하나의 바이너리 이해하는 것입니다, 하나는 바이너리 이해하지 않습니다.

게시 71 개 원래 기사 · 원의 찬양 (54) · 전망 420 000 +

추천

출처blog.csdn.net/weixin_43326401/article/details/104107636