Java 스레드 감청, 예상치 못한 스레드 종료 후 자동 재부팅 방법
전날 마이크로 블로그 파행 프로그램을 썼는데 주요 작업 원리는 2분마다 마이크로 블로그를 파행하여 N명의 팔로우 친구 마이크로 블로그 수량을 얻은 다음에 저장하고 2분 후에 다시 파행하여 마이크로 블로그 수량을 취하는 것이다. 2분 전에 저장한 마이크로 블로그 수량과 비교하면 수량이 증가하면 이 친구가 2분 안에 마이크로 블로그를 발표하고 수량이 감소하면 마이크로 블로그를 삭제하는 것이다.마지막으로 기어오르기 결과를 지정된 휴대전화에 보내서 알림으로!
오늘 웨이보를 보았을 때 자신이 팔로우하는 친구가 웨이보를 발표했지만 자신의 휴대전화는 신고 소식을 받지 못했다. 웨이보 로그를 보니 새벽 6시에 회사 네트워크가 끊어져 네트워크가 막혔다. 프로그램이 웨이보를 밟을 때 네트워크 이상을 던져 Unknown Host Exception을 일으켰다. 이때 라인은 이미 죽었고 급사했다.이 문제를 해결하기 위해서는 다음과 같은 요구가 있습니다. 라인이 죽으면 자동으로 다시 시작됩니다.
일반적인 해결 방법은 다음과 같습니다.
1. 다른 라인을 켜고 기어가는 라인을 감청하고 라인 간의 통신을 사용한다. 일반적으로 소비자 모드이다. 기어가는 라인이 죽은 후에 감청 라인이 통지를 받지만 감청 라인이 먼저 죽으면 시스템도 끊는다!
2, 심장 박동 메커니즘을 사용하여 기어오르는 라인은 일정 시간마다 다른 서버 프로세스에 데이터 패키지를 보냅니다. 만약에 서버 프로세스가 장시간 동안 심장 박동 패키지를 받지 못하면 기어오르는 라인이 이미 다운되었다는 것을 의미합니다!
두 가지 방법 모두 적당한 사용 범위가 있지만 감청 라인이 급사하는 경우 개인적으로 관찰자 모델을 사용하는 것이 적합하다고 생각합니다!관찰자 패턴을 설명해 드리겠습니다.
관찰자 모드: 대상 간의 일대다 의존 관계를 정의합니다. 대상의 상태가 바뀌면 모든 의존 대상이 알림을 받고 자동으로 업데이트됩니다.
관찰자 모드는 JDK에서 이미 이루어진 실현,java.util.Obserable, 감청 스레드를 수행하는 방법은 다음과 같습니다.
감청된 스레드 클래스:
package cn.std.test;
import java.util.Observable;
import cn.std.util.DateUtil;
public class RunThread extends Observableimplements Runnable{
// , ,
publicvoid doBusiness(){
if(true){
super.setChanged();
}
notifyObservers();
}
@Override
publicvoid run() {
intc = 0;
while(true){ //
System.out.println("Runing- "+c+" "+DateUtil.getStdDateTime());
try{
Thread.sleep(2000);
}catch (InterruptedException e) {
e.printStackTrace();
doBusiness();
break;
}
c++;
//
try{
if(c== 4){
Stringstr = null;
str.length();//
}
}catch (Exception e) {
e.printStackTrace();
doBusiness();// , ,
break;// , ,
}
}
}
publicstatic void main(String[] args) {
RunThreadrun = new RunThread();
Listener listen = new Listener();
un.addObserver(listen);
newThread(run).start();
//run.doBusiness();
}
}
감청된 라인은 Observable 클래스를 계승해야 합니다. 계승 후 피관찰자 doBusiness 방법으로 쉽게 변신할 수 있습니다. 여기에 업무 처리 내용을 추가할 수 있습니다. 다음은 Listener
package cn.std.test;
import java.util.Observable;
import java.util.Observer;
public class Listener implements Observer{
@Override
publicvoid update(Observable o, Object arg) {
System.out.println("RunThread ");
RunThreadrun = new RunThread();
run.addObserver(this);
newThread(run).start();
System.out.println("RunThread ");
}
}
간단합니다. Observer 인터페이스를 실현하고 업데이트 방법을 실현하면 방법 내부에서 라인을 다시 시작합니다.이상의 자바 스레드 감청은 의외로 스레드를 종료한 후 자동으로 재부팅하는 실현 방법은 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분께 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.