기타: 다중 스레드 교체 출력 0과 1

2997 단어
주요 사고방식: 하나의 출력 표지와 하나의 자물쇠를 사용하여 실현한다. 출력 임계구에 들어가는 코드는 먼저 자물쇠를 얻은 다음에 표지의 위치가 정확한지 판단하고 표지의 전환을 고려해야 한다.
python 구현
import threading
flag = 0
def print1(lock):
    global flag
    while True:
        with lock:
            if flag==1:
                print("I'm 1")
                flag=0

def print0(lock):
    global flag
    while True:
        with lock:
            if flag==0:
                print("I'm 0")
                flag=1

def print1V1(con):
    global flag
    while True:
        with con:
            if flag==0:#     0,  
                con.wait()
            print("I'm 1")
            flag =0
            con.notify()


def print0V1(con):
    global flag
    while True:
        with con:
            if flag==1:#     1,  
                con.wait()
            print("I'm 0")
            flag=1
            con.notify()



if __name__=="__main__":
    
    #   Lock      01
    lock = threading.Lock()
    t0 = threading.Thread(target=print0,args=(lock,))
    t1 = threading.Thread(target=print1,args=(lock,))
    t0.start()
    t1.start()
    
    #     Condition      01
    con = threading.Condition()
    t0v1 = threading.Thread(target=print0V1,args=(con,))
    t1v1 = threading.Thread(target=print1V1,args=(con,))
    t0v1.start()
    t1v1.start()

Java 구현
public class Output01 {
    private static int flag = 0;

    public static void main(String[] args) {
        Output01 output01 = new Output01();

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    synchronized (output01){
                        if(flag==0){
                            System.out.println(0);
                            flag=1;
                            output01.notify();
                        }else {
                            try {
                                output01.wait();
                            }catch (Exception e){
                                e.printStackTrace();
                            }

                        }

                    }
                }

            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    synchronized (output01){
                        if(flag==1){
                            System.out.println(1);
                            flag=0;
                            output01.notify();
                        }else {
                            try {
                                output01.wait();
                            }catch (Exception e){
                                e.printStackTrace();
                            }
                        }

                    }
                }

            }
        });

        thread1.start();
        thread2.start();
    }
}

좋은 웹페이지 즐겨찾기