보조 스 레 드 표 지 는 잘 써 야 헛되이 기다 리 지 않 는 다.

배경
이전 응용 프로그램 은 1 분 마다 잘못된 http 연결 의 주요 논 리 를 정리 하기 위해 스 레 드 를 만 드 는 작은 기능 이 있 었 습 니 다.
private volatile boolean running = true;
@Override
    public void run() {
        try {
            while (running) {
                synchronized (this) {
                    wait(1000);
                    closeConnections();
                }
            }
        } catch (InterruptedException ex) {
            shutdown();
        }
    }

    public void shutdown() {
        running= false;
        synchronized (this) {
            notifyAll();
        }
    }

문제 설명
최종 영향 은 스 레 드 가 넘 칠 때 까지 스 레 드 를 만 드 는 것 입 니 다. OOM!
분석 하 다.
경험 이 있 는 학생 들 은 여기 running 이 있 는 것 을 볼 수 있 을 것 입 니 다. 이것 은 바로 표지 스 레 드 에서 물 러 나 야 하 는 신 호 량 이지 만 위 치 를 잘못 사용 하거나 시간 을 잘못 사용 하여 스 레 드 가 running 상태 여서 notify 에서 물 러 날 수 없습니다.
해결 방법
    private volatile boolean running = true;
    @Override
    public void run() {
        try {
            while (running ) {
                synchronized (this) {
                    wait(1000);
                    running= false;
                    connMgr.closeExpiredConnections();
                    connMgr.closeIdleConnections(5 * 60, TimeUnit.SECONDS);
                    logger.trace("clear closed http connections ok ,next to exit");
                }
            }
        } catch (InterruptedException ex) {
            shutdown();
        }
    }

    public void shutdown() {
//    	running= false;need to mark at wait
        synchronized (this) {
            notifyAll();
        }
    }

효과.
스 레 드 는 정상적으로 notify 를 받 고 종료 할 수 있 습 니 다.
넓히다
사실 이렇게 쓰 는 것 도 불합리한 부분 이 있다. 예 를 들 어 try while 의 범위, 일반적으로 synchronized 는 while 밖 에 쓰 인 것 이 고 try 는 while 안에 쓰 인 것 이다. 이렇게 쓰 는 것 도 이 장면 에서 기능 요구 에 부합된다. 물론 이렇게 쓰 는 것 도 큰 문제 가 있다 고 할 수 없고 전체적으로 긍정 적 인 에너지 이다.
또한 wait 를 사용 할 필요 가 없습니다. 이 스 레 드 를 처리 하고 있 기 때문에 sleep 는 경쟁 과 관련 되 지 않 은 문 제 를 직접 물 러 날 수 있 습 니 다.

좋은 웹페이지 즐겨찾기