초보 자 는 다 중 스 레 드 의 상세 한 사고 와 절 차 를 배운다.

최근 에 블 로그 원 을 돌아 다 니 면서 다 중 스 레 드 를 보고 공 부 를 하고 싶 습 니 다. 작가 본인 은 상세 하 다 고 생각 하지만 초보 자 들 이 다 중 스 레 드 를 배우 지 않 은 것 에 대해 이해 하 는 것 이 어렵 습 니 다. 가장 많은 것 은 대략적인 뜻 을 알 고 자신 이 쓴 것 은 공백 입 니 다. 저 는 여러 블 로 그 를 본 후에 코드 를 쳐 야 다 중 스 레 드 를 철저하게 이해 할 수 있다 고 생각 합 니 다.다음은 전형 적 인 다 중 스 레 드 문 제 를 예 로 들 어 풋내기 가 문 제 를 푸 는 구체 적 인 절차 이다.
제목: 세 개의 스 레 드 를 만 들 고 A 스 레 드 는 10 번 A 를 인쇄 하 며 B 스 레 드 는 10 번 B 를 인쇄 하고 C 스 레 드 는 10 번 C 를 인쇄 하 며 스 레 드 를 동시에 실행 하고 ABC 를 10 번 교체 인쇄 하도록 요구 합 니 다.
1. 세 개의 스 레 드 를 보고 동시에 실행 하고 인쇄 를 교체 하 며 대신 이 쓴 각종 절차, sleep, synchronized, wait, notify 와 머리 가 아 픕 니 다.아니면 스스로 천천히 하 세 요. A 10 개 를 먼저 인쇄 하 세 요.
 
package main;

/**
 * 
 *        
 * @author  
 * @version 2015 11 20    10:46:53
 *
 */
public class ManyThreadPrint implements Runnable {
    
    public String name;
    
    public ManyThreadPrint(String name){
        this.name=name;
    }

    @Override
    public void run() {
        int count = 10;
        while(count > 0){
            System.out.print(name);
            count--;
        }
    }

    public static void main(String[] args) {
        ManyThreadPrint mtpa = new ManyThreadPrint("A");
        new Thread(mtpa).start();
    }
}

해석: Runnable 인 터 페 이 스 를 실현 하 는 방식 으로 스 레 드 를 사용 합 니 다. main 방법 에 인 스 턴 스 를 추가 하여 구조 기 인삼 A 를 사용 하고 run () 방법 을 다시 쓰 는 중 10 회 반복 인쇄 합 니 다.
실행 결 과 는 다음 과 같 습 니 다.
AAAAAAAAAA

2. 10 회 A 인쇄 완료, 하하, B 와 C 를 아래 에 인쇄 해 보 세 요
package main;

/**
 * 
 *        
 * @author  
 * @version 2015 11 20    10:46:53
 *
 */
public class ManyThreadPrint implements Runnable {
    
    public String name;
    
    public ManyThreadPrint(String name){
        this.name=name;
    }

    @Override
    public void run() {
        int count = 10;
        while(count > 0){
            System.out.print(name);
            count--;
        }
    }

    public static void main(String[] args) {
        ManyThreadPrint mtpa = new ManyThreadPrint("A");
        ManyThreadPrint mtpb = new ManyThreadPrint("B");
        ManyThreadPrint mtpc = new ManyThreadPrint("C");
        new Thread(mtpa).start();
        new Thread(mtpb).start();
        new Thread(mtpc).start();
    }
}

해석: main 방법 에 두 개의 인 스 턴 스 를 추가 하여 B 와 C 를 입 히 고 두 개의 스 레 드 를 추가 하여 실행 합 니 다.
실행 결 과 는 다음 과 같 습 니 다.
AAAAAAAAAABBBBBBBBBBCCCCCCCCCC

비천 하 다.
AAAAAAAAAACCCCCCCCCCBBBBBBBBBB

어떻게 된 거 야?다시 시도 해 보 세 요:
ABBBBBBBBBBAAAAAAAAACCCCCCCCCC

좋 습 니 다. 결 과 는 A 10 개, B 10 개, C 10 개 를 모두 인쇄 했 지만 결과 가 고정 되 지 않 았 습 니 다.
3. 자 료 를 찾 아 보 니 3 개의 라인 이 동시에 실행 되 고 순서 가 고정 되 지 않 았 다.어 쩔 수 없 이 뒤의 스 레 드 를 잠시 기 다 렸 다가 실행 하 게 합 니 다.
package main;

/**
 * 
 *        
 * @author  
 * @version 2015 11 20    10:46:53
 *
 */
public class ManyThreadPrint implements Runnable {
    
    public String name;
    
    public ManyThreadPrint(String name){
        this.name=name;
    }

    @Override
    public void run() {
        int count = 10;
        while(count > 0){
            System.out.print(name);
            count--;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ManyThreadPrint mtpa = new ManyThreadPrint("A");
        ManyThreadPrint mtpb = new ManyThreadPrint("B");
        ManyThreadPrint mtpc = new ManyThreadPrint("C");
        new Thread(mtpa).start();
        Thread.sleep(10);
        new Thread(mtpb).start();
        Thread.sleep(10);
        new Thread(mtpc).start();
        Thread.sleep(10);
    }
}

해석: 주의 할 점 이 있 습 니 다. Thread. sleep (10);다음 스 레 드 가 시 작 될 때 까지 기 다 려 야 하 는 시간 입 니 다. 마지막 결 과 는 교체 인쇄 가 필요 하기 때문에 세 번 째 스 레 드 가 실 행 된 후에 도 대기 가 있 습 니 다. 다음 라운드 의 첫 번 째 스 레 드 대기 에 해당 합 니 다.
결 과 는 다음 과 같다.
AAAAAAAAAABBBBBBBBBBCCCCCCCCCC

3. 다음은 ABC 를 교체 하여 대신 의 방법 에 따라 3 개의 대상 을 만 드 는 것 입 니 다. 세 개의 일반적인 Object 이지 만 run () 에서 동기 화, 대기, 자 물 쇠 를 풀 어 스 레 드 의 실행 순 서 를 실현 하고 코드 를 먼저 보 겠 습 니 다.
package main;

/**
 * 
 *        
 * @author  
 * @version 2015 11 20    10:46:53
 *
 */
public class ManyThreadPrint implements Runnable {
    
    public String name;
    public Object prev;
    public Object self;
    
    public ManyThreadPrint(String name, Object prev, Object self) {
        this.name = name;
        this.prev = prev;
        this.self = self;
    }


    @Override
    public void run() {
        int count = 10;
        while(count > 0){
            synchronized (prev) {
                synchronized (self) {
                    System.out.print(name);
                    count--;
                    self.notify();
                }
                try {
                    prev.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Object a = new Object(); 
        Object b = new Object();
        Object c = new Object();
        ManyThreadPrint mtpa = new ManyThreadPrint("A",c,a);
        ManyThreadPrint mtpb = new ManyThreadPrint("B",a,b);
        ManyThreadPrint mtpc = new ManyThreadPrint("C",b,c);
        new Thread(mtpa).start();
        Thread.sleep(10);
        new Thread(mtpb).start();
        Thread.sleep(10);
        new Thread(mtpc).start();
        Thread.sleep(10);
    }
}

해석:
구조 기 를 바 꿉 니 다. 매번 인 스 턴 스 를 만 들 때마다 인쇄 된 문자열 을 제외 하고 두 개의 대상 이 있 습 니 다. 이 두 대상 은 일반적인 Object 일 뿐 스 레 드 와 털실 관계 가 없 으 며 스 레 드 를 통 해 대상 잠 금 작업 을 통 해 절 차 를 제어 합 니 다.핵심 코드 는 run () 의 순환 에서 조금씩 옵 니 다.
여기 synchronized (self), synchronized (prev), self 현재 대상 잠 금, prev 이전 (접두사) 대상 잠 금, 스 레 드 가 두 대상 잠 금 을 가 져 올 때 인쇄 를 실행 합 니 다.주의 가 필요 하 다.동기 화 됨 (self) 을 동기 화 됨 (prev) 에 서 는 인쇄 A 스 레 드 가 실 행 된 후 선행 C 대상 을 기다 리 는 스 레 드 탱크 에 들 어가 C 를 인쇄 할 때 C 대상 을 깨 우 면 인쇄 C 가 완료 되면 바로 A 를 인쇄 합 니 다. 그러나 이렇게 실행 하려 면 3 개의 스 레 드 의 시작 순 서 를 확보 해 야 합 니 다. 즉, main 방법의 Thread. sleep (10) 입 니 다.인쇄 A 스 레 드 를 시작 할 때 A 를 인쇄 하고 자신 을 깨 우 며 C 를 기다 리 는 스 레 드 탱크 에 들 어가 AC 를 방출 합 니 다.3 개의 스 레 드 가 시작 순서에 따라 완 료 될 때, 즉 C 스 레 드 를 인쇄 한 후에 바로 A 를 인쇄 하고 A 스 레 드 를 인쇄 한 후에 바로 B 를 인쇄 하여 순서대로 순환 합 니 다.
즉, 3 개의 스 레 드 가 시 작 된 후에 인쇄 A 의 스 레 드 를 C 대상 을 기다 리 는 스 레 드 풀 에 들 어간 것 이다.인쇄 B 의 스 레 드 를 A 대상 을 기다 리 는 스 레 드 탱크 에 들 어가 기;인쇄 C 의 스 레 드 를 B 대상 을 기다 리 는 스 레 드 탱크 에 넣 습 니 다.이 때 A 스 레 드 를 인쇄 하고 B 스 레 드 를 인쇄 하 며 C 스 레 드 를 인쇄 하 는 순서 로 실행 하면 다음 라운드 가 A 스 레 드 를 인쇄 하 는 것 으로 시작 하여 나중에 인쇄 순 서 를 확보 합 니 다.
자신 이 코드 를 치 는 과정 에서 알 아 볼 때 발견 하지 못 한 것 을 많이 발 견 했 기 때문에 배 우 는 것 은 스스로 한 번 때 리 는 것 이 좋다.

좋은 웹페이지 즐겨찾기