이하 구디아카데미 김지훈 강사님의 수업자료와 강의 내용 정리, 실습한 내용을 정리함
잠을 잘 자야 일도 잘하는 법이다... sleep 은 비효율적인데. 아무 말 대잔치╰(°▽°)╯
Thread Pool
Thread Pool 생성
- Thread Pool 은 대여소 같은 역할을 수행한다.
- Thread 를 보유하고 있다가 순서에 따라 빌려주고, 사용 후 돌려받는다.
- Thread Pool 은 ExecutorService 객체를 통해 생성된다.
- 생성 시에는 초기 코어 최대 스레드 수를 명시해 준다.
Thread Pool 생성 방법
-
cachedTreadPool : 스레드가 없다가 요청이 있으면 만든다. 요청이 있을 때 반납받은 스레드가 있으면 그걸 빌려준다. 반납받은 스레드가 60초 이상 빌리는 사람이 없으면 폐기한다.
-
FixedTreadPool : 평소에 n 개의 스레드를 유지한다.
현재 cpu 에서 사용 가능한 스레드수를 int n 에 담아, n 개로 ThreadPool 를 픽스해서 만들어둔다. (코드상 이것을 pool2 변수에 담는다.)
Thread Pool 의 작업
- Thread Pool 의 작업은 Runnable 과 Callable 로 생성한다.
- 두 방법의 차이는 return 값의 유무이다.
- 생성된 작업은 submit() execute() 로 실행 시킨다
- Callable 을 구현받았으면 submit() 로 요청해야 하고
- Runnable 을 구현받았으면 execute() 로 요청해야 한다. 그런데 submit() 으로도 요청할 수 있다.
- Thread Pool 의 Thread 는 Main Thread 가 종료되더라도 계속 실행 상태로 남아 있는다.
- 그래서 종료 메서드가 따로 존재한다.
Runnable
- 사용 가능한 프로세스를 getRuntime 으로 가져와 변수 n 에 담는다.
- FixedThreadPool 을 이용하여 n 을 pool 변수에 담는다.
- Runnable 을 runnable 변수로 객체화해오면서 익명 함수 실행
- void 타입 run 메서드로 "Runnable 처리" 를 콘솔에 찍는다.
- pool 에 runnable 을 execute 를 사용해 실행시킨다.
- 작업 중인 스레드가 있으면 종료까지 기다린 후에 pool 을 닫도록 pool.shutdown 메서드를 사용해 준다.
- 이때 종료되지 않은 스레드가 있으면 기다리도록 awaitTermination 을 pool 에 사용해 준다.(1초 동안 기다리도록)
- 결과값을 boolean 타입 변수 end 에 담는다.
- end 에는 정상 종료되었다면 true, 강제 종료되었다면 false 가 담긴다.
- 콘솔에 end 출력
callable
- 사용 가능한 프로세스를 getRuntime 메서드를 통해 변수 n에 담아준다.
- 변수 n을 FixedThreadPool 을 사용해 변수 pool 에 담는다(스레드 풀을 만들어줌)
- Callable을 String 타입으로 객체화하여 call 변수에 담고 익명함수를 실행한다.
- call 메서드 실행, 콘솔에 "callable 실행" 을 찍어주고 return 값은 "complete" fh gksek.
- call 은 submit 함수를 통해 pool에 실행시키고 그 값을 result 에 받는다.
- 콘솔에 result 값을 받아와 찍는다.
- 작업 중인 스레드가 있으면 종료까지 기다린 후에 pool 을 닫도록 shutdown 메서드를 사용해 준다.
- 이때 종료되지 않은 스레드가 있으면 1초 동안 기다리도록 awaitTermination 을 사용해 변수 end 에 담아준다.
- 콘솔에 end 찍기
Thread Pool 10 번 출력
- 가용한 스레드를 가져와 pool 을 만듦
- Runnable 을 run 으로 객체화 후 익명객체 실행
- run 메서드로 현재 실행 중인 thread 의 이름 콘솔에 찍어줌
- for 문으로 1~10까지 run을 반복 실행해 줌
- pool 을 모두 실행 후 닫아줌 > 실행 완료되지 않은 것 있으면 1초 기다림 > 콘솔에 end 값 찍기
Thread Pool Blocking
- Thread Pool 에서는 runnable 과 callable 관계없이 작업 완료 후 Future 객체를 반환한다.
- Future 객체를 가져 오는 get() 메서드는 join() 과 같은 역할을 수행한다.
- 우리는 이것을 Blocking 이라고 한다.
Blocking1
Blocking2
요약
- Runnable 은 반환 값이 없지만 callable 은 반환 값이 있다.
- callable 은 반환 값이 있으므로 submit() 만 사용 가능하다.
- execute() 는 예외를 일으킨 스레드를 죽인다.
- submit() 사용하면 join() 처럼 blocking 이 가능하다.
- 스레드 풀 사용의 장점은?
- Thread 를 보유하고 있다가 순서에 따라 빌려주고 사용 후 돌려받는 형식으로, 낭비를 줄여준다.
- 스레드 풀 생성시 어떤 객체를 통해 생성하는가?
- newCachedThreadPool / newFixedThreadPool
- 스레드 풀 생성 메서드에 들어가는 매개변수는 무엇을 나타내나요?
- 현재 cpu 에서 사용 가능한 스레드 수 / 기본적으로 보유하고 있는 스레드 수
- 스레드 풀 생성 방법 2가지의 차이점은?
-newCachedThreadPool : 요청이 있을 때 생성하고 없으면 폐기 / newFixedThreadPool : 기본적으로 보유하고 있는 스레드가 있어서 빌려줌
- Runnable 구현 클래스와 Callable 구현 클래스의 차이점은?
- execute, submit의 차이점을 설명하시오.
- execute: Runnable 의 실행 메소드. void 타입으로 작업 처리 결과를 받지 못함. 작업 처리 도중 예외 상황에 스레드를 종료하고 풀에서 스레드 제거
- submit : calluble 의 실행 메서드. 작업 처리 결과를 Future 를 통해 반환됨. 작업 처리 도중 예외 상황에도 스레드를 종료하지 않고 재사용.
- 종료 메서드를 사용해야 하는 이유에 대해 설명하시오.
- 사용한 스레드를 종료해서 낭비를 줄이기 위해?
- Thread Pool 을 종료시키는 메서드 3가지는 무엇인가?
- shutdown / shutdownNow / awaitTemination
- Shutdown 메소드의 대해 설명하시오.
- 실행 중인 스레드가 모두 종료 후 스레드 풀을 닫아줌
- awaitTermination은 어떤 메소드 호출 이후 반환되는지 설명하시오.
- ShutdownNow의 단점을 설명하시오.
- 실행이 마무리되지 않은 메서드를 무시하고 종료함
- blocking을 활용하기 위해서 Future 객체의 어떤 메서드를 사용해야 하는지
- blocking을 안 썼을 때와 썼을 때, 콘솔 창에서의 차이는?
- blocking을 쓰는 세 가지 방법은?
- Runnable 에 submit 사용 / sleep 사용 / pool.submit(call).get(); // <- 의미 없는 값을 반환하도록 하여 Callable 구현
JAVA Network
정의
- Network 는 서로 다른 computer 끼리 서로 연결되어 있는 망을 의미한다.
- Computer 가 사물 (Thing) 로 변화하면서 IOT(Internet Of Things) 가 되는 것이다.
- Network 에서의 첫 번째 과제는 목적지 컴퓨터 까지 어떻게 가느냐이다.
- 실생활에서 현재 지점에서 약속 장소에 어떻게 가느냐와 마찬가지이다.
- Network 에서는 그 주소가 IP 주소와 port 번호이다.
- 그리고 이 주소를 알기 쉽게 하기 위해 우리는 domain 이라는 것을 사용한다.
Network 기초
- network 세계에서 도착해야 할 목적 computer 를 server 라고 한다.
- 그리고 그곳을 찾아가는 computer 를 client 라고 한다.
- Client 는 특정 목적을 수행하기 위해 server 에게 찾아가 request 를 한다.
- Server 는 Client 의 요청에 대해서 응답한다.
공인IP(public)
외부에서 알고 들어올 수 있는 주소
사설IP(private)
192 로 시작하면 사설 IP / 내부에서만 알 수 있는 주소
공유기(라우터)
공유기가 공인 IP를 받아서 내부적으로 뿌려준다.(사설IP)
IP 주소 얻기
- Java 에서는 자신의 IP 를 얻을 수 있다.
- 특정 domain 에 연결되어 있는 IP 도 찾아낼 수 있다.
TCP(Transmission Control Protocol)
- TCP 는 연결 지향 프로토콜로, 데이터를 안전하고 정확하게 전달한다.
- 단점은 데이터를 보내기 전에 반드시 연결을 형성해야 하며, UDP 보다 속도가 느리다.
- TCP 를 통해서 Client 로 Server 에 접속해 보자.
- 둘이 접속을 하기 위해서는 Socket 이 필요하다.
- 이것을 소켓 통신이라고 부른다.
내일 할 것 미리...
Echo Server
- Client 와 Server 가 접속했다면 Stream 을 통해 data 를 전송할 수 있다.
- 받은 내용을 그대로 응답하는 Echo 서버 만들기.