JAVA NIO 사용 소감
15368 단어 프로젝트 경험
먼저 BIO, NIO, AIO 를 비교 해 보 겠 습 니 다.
BIO (IO) 동기 화 차단, 전통 io 방식.연결 수량 이 비교적 작고 고정된 구조 에 적용 되 는데 이런 방식 은 서버 자원 에 대한 요구 가 비교적 높 고 병발 은 응용 에 국한 된다.NIO 동기 화 비 차단, jdk 4 지원 시작.연결 수량 이 많 고 연결 이 비교적 짧 은 구조, 예 를 들 어 채 팅 서버 에 적용 된다.AIO 비동기 비 차단, jdk 7 지원 시작.연결 수량 이 많 고 연결 이 비교적 긴 구조 에 적용 된다.이미지 의 이해 NIO 와 AIO: 커 널 을 배달 에 비유 하면 NIO 는 배달 이 아래층 에 도 착 했 는 지 확인 하고 택 배 를 찾 으 러 가 는 것 이다.에 이 오 는 배달 원 이 집 까지 배달 해 줬 어 요.
프로젝트 코드 는 다음 과 같 습 니 다.
public boolean processData() throws Exception {
logger.info("processData....Start...");
initQueue();
logger.info(" selector ");
Thread t = new Thread(new Runnable() {
@Override
public void run() {
Selector selector = null;
try {
selector = Selector.open();
for (String serverIP : ipSet) {
SocketChannel sChannel = createSocketChannel(serverIP, 8000);
// ( ) validOps: , 。
// , SelectionKey.validOps
SelectionKey key = sChannel.register(selector, sChannel.validOps());
System.out.println("CreateSocketChannel ip:" + serverIP + " SelectionKey:" + key);
// SocketChannel Selector map
selKeyMap.put(key, serverIP);
}
logger.info("processData....End...");
//
while (true) {
logger.info("loading...");
try {
//
selector.select();
} catch (IOException e) {
logger.error("select ");
e.printStackTrace();
}
// selectionKey
Iterator it = selector.selectedKeys().iterator();
//
while (it.hasNext()) {
//
SelectionKey selKey = it.next();
//
try {
//
processSelectionKey(selKey);
} catch (IOException e) {
//
// selKey.cancel();
logger.error(" ,key:" + selKeyMap.get(selKey));
e.printStackTrace();
}
// key,
it.remove();
}
// 1
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (selector != null) {
selector.close();
}
// if (ssc != null) {
// ssc.close();
// }
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
t.setDaemon(true);
t.start();
//
Timer heartBeatTimer = new Timer();
TimerTask heartBeatTimerTask = new TimerTask() {
@Override
public void run() {
logger.info("heartBeatTimerTask timer");
logger.info("selKeyMap size is " + selKeyMap.size());
for (SelectionKey key : selKeyMap.keySet()) {
try {
SocketChannel channel = (SocketChannel) key.channel();
heartBeat.clear();
byte value = (byte)0x7e;
heartBeat.put(value);
heartBeat.put(value);
heartBeat.flip();
if (key.isValid() && key.isWritable()) {
channel.write(heartBeat);
}
}
catch (Exception e) {
logger.info(e.getMessage());
e.printStackTrace();
}
}
}
};
// 10
heartBeatTimer.schedule(heartBeatTimerTask, 10000, 10000);
return true;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
프로젝트 경험helm 노드의 탄성 신축, 클라우드 호스트에 대한 탄성 신축을 이용하여 알리 클라우드 로그 서비스 은 jenkins shell 또는 drone을 사용할 수 있습니다. 이것은 클라우드 서비스 업체가 제공하는 서비스입...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.