보조 스 레 드 표 지 는 잘 써 야 헛되이 기다 리 지 않 는 다.
이전 응용 프로그램 은 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 는 경쟁 과 관련 되 지 않 은 문 제 를 직접 물 러 날 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
javasynchronized 동기화 정적 방법과 동기화 비정적 방법의 공통점우리는synchronized를 사용하여 대상 변수를 동기화할 수 있을 뿐만 아니라,synchronizedl를 통해 동기화 클래스의 정적 방법과 비정적 방법을 동기화할 수 있습니다. 자바 관련 문법에서 알 수 있듯이s...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.