자바 다 중 스 레 드 기초 (4) 자바 전통 스 레 드 동기 화 통신 기술

자바 다 중 스 레 드 기초 (4) 자바 전통 스 레 드 동기 화 통신 기술
코드 를 작성 하여 다음 과 같은 기능 을 실현 합 니 다.
하위 스 레 드 는 10 회 순환 하고, 이 어 주 스 레 드 는 100 회 순환 하 며, 이 어 다시 하위 스 레 드 로 10 회 순환 하고, 이 어 다시 주 스 레 드 로 100 회 순환 하 며, 이렇게 50 회 순환 합 니 다.
분석 하 다.
1) 하위 스 레 드 10 회 순환 과 주 스 레 드 100 회 순환 은 서로 배척 하 는 실행 이 어야 하 며 교차 가 발생 해 서 는 안 됩 니 다. 아래 코드 에서 synchronized 키 워드 를 통 해 이 요 구 를 실현 합 니 다.2) 서브 스 레 드 와 메 인 스 레 드 는 반드시 교체 되 어야 하 며 스 레 드 동기 통신 기술 을 통 해 이 루어 질 수 있 습 니 다. 아래 코드 에서 bhouldSub 변 수 를 통 해 이 요 구 를 실현 할 수 있 습 니 다.
기타 주의해 야 할 점
1) 그 중에서 business 변 수 는 final 형식 이 라 고 밝 혀 야 합 니 다. 익명 내부 류 와 부분 내부 류 에서 호출 된 부분 변 수 는 final 이 어야 하기 때 문 입 니 다. - 변수의 일치 성 (컴 파일 할 때 final 변 수 는 부분 내부 류 의 변수 로 복 사 됩 니 다) -또한 국부 변수의 생명 주기 와 국부 내부 류 의 대상 의 생명 주기 가 일치 하지 않 는 것 을 피한다.
그렇지 않 으 면 - 이 변수 가 국부 내부 클래스 에 전 달 된 후에 국부 변수 가 외부 클래스 에서 수정 되면 내부 클래스 에서 이 변수의 값 이 외부 클래스 와 일치 하지 않 아 예측 할 수 없 는 상황 이 발생 할 수 있 습 니 다.또는 국부 변수의 생명주기 가 방법의 끝 에 따라 창고 에서 제거 되 고 국부 내부 클래스 가 존재 하지 않 는 변수 에 접근 합 니 다.멤버 변수 라면 final 이 필요 없습니다.
자세 한 내용 은 다음 과 같은 문장 을 참고 할 수 있다.http://feiyeguohai.iteye.com/blog/1500108 http://blog.csdn.net/whuslei/article/details/6251020 2) 내부 유형 은 구성원 내부 유형, 정태 내부 유형, 국부 내부 유형, 익명 내부 유형 네 가지 로 나 뉘 는데 네 가지 수명 주기 와 상세 한 사용 방법 은 구 글 이나 도 모 에 게 스스로 물 어보 세 요.
코드 구현
package cn.king;

public class TraditionalThreadCommunication {

    public static void main(String[] args) {
        //      final
        final Business business = new Business();
        new Thread(
                new Runnable() {

                    @Override
                    public void run() {
                        for(int i=1; i<=50; i++) {
                            business.sub(i);
                        }
                    }

                }
                ).start();

        for(int i=1; i<=50; i++) {
            business.main(i);
        }
    }

}

class Business {
    //           
    private boolean bShouldSub = true;
    public synchronized void sub(int i) {
        if(!bShouldSub) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for(int j=1; j<=10; j++) {
            System.out.println("sub thread sequence of " 
                                + j + ", loop of " + i);
        }
        bShouldSub = false;
        this.notify();
    }
    public synchronized void main(int i) {
        if(bShouldSub) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for(int j=1; j<=100; j++) {
            System.out.println("main thread sequence of " 
                                + j + ", loop of " + i);
        }
        bShouldSub = true;
        this.notify();
    }
}

좋은 웹페이지 즐겨찾기