의사 비동기 IO

2057 단어 IO의사 비동기
앞에서 말 했 듯 이 동기 화 차단 IO 는 매우 큰 성능 문제 가 있 을 수 있 습 니 다.그러면 스 레 드 탱크 를 사용 하여 제어 하면 의사 비동기 IO 가 있 습 니 다.스 레 드 탱크 를 통 해 메시지 큐 와 최대 스 레 드 수 를 제어 합 니 다.예 를 들 어 다음 과 같 습 니 다.
package com.honzh.mwq.bio.server.handler;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TimeServerHandlerPool {
	private ExecutorService service;

	/** 
	* @Title: TimeServerHandlerPool
	* @Description:             :<br>
	* <p>1.Runtime.getRuntime().availableProcessors()   Java             </p>
	* <p>2.      cmd     echo %NUMBER_OF_PROCESSORS%     cpu     </p>
	* <p>3.     i3 3220,   2  4      ,              ,      4    </p>
	* <p>4.    API    ,      ,corepoolsize maxpoolsize        , execute     ,         core,           ,
	*            core,           ,        ,       ,       max,       。
	* </p>
	* 
	*/
	public TimeServerHandlerPool() {
		service = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), 100, 120L, TimeUnit.SECONDS,
				new ArrayBlockingQueue<Runnable>(1000));
	}

	public void execute(Runnable task) {
		service.execute(task);
	}
}

 이 종 류 는 매우 중요 하 니 주석 에서 말 한 내용 에 주의 하 세 요.
서버 클래스
TimeServerHandlerPool pool = new TimeServerHandlerPool();
			Socket socket = null;
			while (true) {
				socket = server.accept();
				
				pool.execute(new TimeServerHandler(socket));
			}

 스 레 드 탱크 관 리 를 통 해 작업 을 요청 합 니 다.
요약:위조 비동기 IO 는 자원 지연 문 제 를 효과적으로 해결 하 였 으 나 다음 과 같은 문제 가 존재 합 니 다.입 출력 흐름 은 여전히 막 혔 습 니 다.만약 에 server 가 정 보 를 되 돌려 1 분 동안 막 았 다 면 해당 하 는 client 는 자원 을 얻 을 때 읽 기 흐름 에서 1 분 동안 막 혔 습 니 다.그 다음 에 앞으로 의 요청 이 차단 대기 열 에 다시 가입 하지 못 하면새로운 요청 이 거부 된다 면 시스템 이 무 너 지 는 것 과 같다.

좋은 웹페이지 즐겨찾기