WAS구현 중 첫번쨰 요구사항 중 하나가 Java Thread기반으로 작성되어 있는 현재 프로젝트를 Concurrent패키지를 사용하도록 변경하라는 것이었다. 멀티 쓰레드 프로그래밍도 운영체제 시간 과제로 한번 써본거 외에는 사용해본적이없고 해당 요구사항 중 스레드 모델과 버전별 변경점에 대해 학습하라는 내용이 있어 공부해보게 되었다.
우선 Concurrent패키지가 무엇인지 먼저알아보자.
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html
oracle에 있는 문서를 보면 동기화에 사용하는 여러 class 및 method들이 존재한다. 과거 C언어로 운영체제 과제를 할때 세마포어와 비슷한 모습을 띄는듯 했다. 당시 과제가 멀티쓰레드로 나누어 숫자세는 일을 하는 것이었는데 Java에서도 비슷하게 쓰이는듯했다. 그래서 이걸 어떻게 써야 되는지 몰랐는데 같은 스터디원이 Java Excecutor라는 걸 알려줬다.
우선 사용법은 다음과 같다.
ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
try (ServerSocket listenSocket = new ServerSocket(port)) {
logger.info("Web Application Server started {} port.", port);
Socket connection;
while ((connection = listenSocket.accept()) != null) {
executorService.execute(new HttpConnectionHandler(connection));
}
}finally {
executorService.shutdown();
}
ThreadPool을 구현하는 인터페이스로 등록된 작업들을 execute를 통해 실행한다.
정말 단순하지만 내가 몰랐던 사실은 서버는 멀티쓰레드로 해야하는 것이다. 그 이유는 한 사람만 서버를 쓰는게 아니라 동시에 여러 사람들이 접속하기 때문에 이를 처리하는 데 효율적이기 때문이다.
자바 스레드 모델의 변경점
스레드는 하나의 프로세스 안에 실행되는 여러 일을 수행하는 것이다.
User Level Thread : 프로세스에 의해 제어되는 스레드
Kernel Level Thread : OS에의해 제어되는 스레드
Thread클래스, Runnable인터페이스 -> Concurrent패키지 -> 가상스레드 의 형태로 변화하고 있다. OS지식이 부족하여 세부적으로 이해하기는 어려워 볼 수 있을때 다시 보려고한다.
참고자료들
https://zion830.tistory.com/57
https://4urdev.tistory.com/104
https://e-una.tistory.com/70#2.%20Multi%20Threading%20Model
https://mangkyu.tistory.com/309
https://mangkyu.tistory.com/259
'프로그래밍 > 개발' 카테고리의 다른 글
MVC패턴 왜 쓸까요 (0) | 2024.02.01 |
---|---|
if문을 줄이는 방향에 대한 고찰 (0) | 2024.01.23 |
HTTP Response, Request에 관하여 (0) | 2024.01.22 |
몰랐던 Git에 관한 이야기 (0) | 2024.01.21 |
WAS란 무엇인가? (0) | 2024.01.21 |