Java 공부 (27) 썸네일형 리스트형 13장 제네릭(Generic) 제네릭이란? -> 타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 하는 것-컬렉션, 람다식(함수적 인터페이스), 스트림, NIO에서 널리 사용된다. 제네릭을 사용하므로서 얻는 이점1. 컴파일시 강한 타입 체크를 할 수 있다.-컴파일시에 미리 타입을 강하게 체크해서 에러를 사전에 방지한다. 따라서 실행 시 타입에러가 나는 것을 방지해준다.*컴파일러가 미리 오류를 체크함으로서 실행 시의 버그를 줄일 수 있음2. 타입 변환을 제거할 수 있다.-타입 변환이 생기면 생길수록 전체 애플리케이션 실행 성능에는 좋지 않다. 따라서 타입변환을 적게 발생시키는 것이 좋다.-다음과 같이 제네릭을 사용하면 타입변환을 제거할 수 있다. 제네릭 사용 전 제네릭 사용 후 List list = new ArrayList();.. 12장 스레드풀(4) 작업 완료순으로 통보 받기-작업 요청 순서대로 작업 처리가 완료되는 것은 아니다.-작업의 양과 스레드 스케쥴링에 따라서 먼저 요청한 작업이 나중에 완료되는 경우도 발생한다.-여러 개의 작업들이 순차적으로 처리될 필요성이 없고, 처리 결과도 순차적으로 이용할 필요가 없다면 --> 작업 처리가 완료된 것부터 결과를 얻어 이용하는 것이 좋다.-스레드 풀에서 작업 처리가 완료된 것만 통보 받는 방법-CompletionService는 처리 완료된 작업을 가져오는 poll()과 take()메소드를 제공한다.리턴타입 메소드명(매개변수) 설명 Future poll() 완료된 작업의 Future를 가져옴. 완료된 작업이 없다면 즉시 null을 리턴함 Future poll( long timeout, TimeUnit uni.. 12장 스레드풀(3) 리턴값이 있는 작업 완료 통보 Callable task = new Callable() {@Overridepublic T call() throws Exception {//스레드가 처리할 작업 내용return T;}};Future future = executorService.submit(task)try {T result = future.get();} catch (InterruptedException e) {//작업 처리 도중 스레드가 interrupt될 경우 실행할 코드} catch(ExecutionException e) {//작업 처리 도중 예외가 발생된 경우 실행할 코드} 1) 리턴값이 있는 작업을 정의할 때는 Callable 객체를 사용한다. 에는 리턴값의 타입을 선언해 놓는다.2) Callable이 .. 12장 스레드풀(2) 블로킹 방식이란?무언가를 요청을 하고 나서 요청의 결과가 나올때까지 기다리는 방식을 이야기 한다. 블로킹 방식의 작업 완료 통보 받기리턴타입 메소드명(매개변수) 설명 Future submit(Runnable task) - Runnable 또는 Callable을 작업 큐에 저장 - 리턴된 Future를 통해 작업 처리 결과를 얻는다. Future submit(Runnable task, V result) Future submit(Callable task) Future-작업 결과가 아니라 지연완료(pending completion)객체-작업이 완료될 때까지 기다렸다가 최종 결과를 얻기 위해서 get()메소드를 사용한다.리턴타입 메소드명(매개변수) 설명 V get() 작업이 완료될 때까지 블로킹 되어있다가 처리.. 12장 스레드풀(1) 스레드 폭증-병렬 작업 처리가 많아지면 스레드의 개수가 증가한다.-스레드 생성과 스케쥴링으로 인해 CPU가 바빠지고, 메모리 사용량이 늘어난다.-따라서 애플리케이션의 성능이 급격히 저하된다. 다양한 작업을 동시에 처리하면서도 많은 수의 작업에 따른 무분별한 스레드의 생성을 막고, 애플리케이션의 성능이 저하되지 않게 하기 위해서 스레드를 효율적으로 관리하는 스레드 풀이 등장하였다. 스레드 풀(Thread Pool)-스레드 풀은 스레드의 개수를 미리 정해놓고 그 한도 내에서 사용하는 것을 말한다.-작업 처리에 사용되는 스레드를 제한된 개수만큼 미리 생성 -작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리한다.-작업 처리가 끝난 스레드는 작업 결과를 애플리케이션으로 전달한다.-스레드는 다시 .. 12장 스레드 그룹 스레드 그룹-관련된 스레드를 묶어서 관리할 목적으로 이용 ex) main그룹 밑에 main스레드, sub그룹 밑에 sub스레드-스레드 그룹은 계층적으로 하위 스레드 그룹을 가질 수 있다.-자동 생성되는 스레드 그룹-system 그룹 : JVM운영에 필요한 스레드들을 포함-system/main 그룹 : 메인 스레드를 포함-스레드는 반드시 하나의 스레드 그룹에 포함된다.-기본적으로 자신을 생성한 스레드와 같은 스레드 그룹에 속하게 된다.-명시적으로 스레드 그룹에 포함시키지 않으면 기본적으로 system/main그룹에 속한다. 스레드 그룹 이름 얻기ThreadGroup group = Thread.currentThread.getThreadGroup(); //스레드를 실행하고 있는 현재스레드 객체를 얻어서, 스레.. 12장 데몬 스레드 데몬 스레드-주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드-주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료한다.ex) 워드프로세서의 자동저장 : 워드프로세서를 실행하는 주 스레드가 종료되면, 자동저장되는 데몬 스레드도 종료 미디어플레이어의 동영상 및 음악 재생 : 미디어플레이어를 실행하는 주 스레드가 종료되면 동영상과 음악 재생하는 데몬스레드도 종료 가비지 컬렉터 : JVM이 실행하고 있을 동안에만 가비지 컬렉터가 실행되는 것이다. JVM이 실행하는 메인스레드가 종료되면 gc도 종료 데몬 스레드 설정-주 스레드가 데몬이 될 스레드의 setDaemon(true)를 호출public static void main(String[] args) {AutoSaveThread thread = new.. 12장 스레드 상태 제어(2) 프로그램에서 경우에 따라서는 실행 중인 스레드를 즉시 종료할 필요가 있다.이때 stop() 메소드로 스레드를 종료할 수 있는데, stop() 메소드는 사용하지 않는 것이 좋다.stop() 메소드-스레드를 즉시 종료시킨다.-스레드를 갑자기 종료하게 되면 사용 중이던 자원들이 불안전한 상태로 남겨진다.-deprecated : 웬만해선 사용하지 말아라 라는 뜻 따라서 스레드의 안전한 종료를 위해서는 2가지의 방법이 있다. 스레드의 안전한 종료 - stop 플래그, interrupt()1. stop 플래그를 이용하는 방법-stop 플래그로 메소드(run()메소드)의 정상 종료를 유도한다.public class XXXThread extends Thread {private boolean stop; //stop 플래.. 12장 스레드 상태 제어(1) 상태 제어-실행 중인 스레드의 상태를 변경하는 것을 말한다.-상태 변화를 가져오는 메소드의 종류 Thread가 가지고 있는 상태제어 함수를 살펴보면 다음과 같다. sleep() :주어진 시간동안 일시 정지try {Thread.sleep(1000);} catch(InterruptedException e) {//interrupt() 메소드가 호출되면 실행} -얼마 동안 일시 정지 상태로 있을 것인지, 밀리세컨드(1/1000)단위로 지정-일시 정지 상태에서 interrupt()메소드가 호출되면 InterruptedException이 발생할 수 있기 때문에 예외처리를 꼭 해주어야 한다. yield() :다른 스레드에게 실행 양보-현재 실행하는 스레드를 실행대기 상태로 즉시 되돌리고 동일 또는 높은 우선순위의 스.. 12장 스레드 상태 스레드는 new연산자로 객체를 생성하고 나서, 종료를 할 때까지 여러 상태를 가질 수 있다. new연산자로 생성되어진 스레드 객체는 start()메소드를 실행하여 실행 대기(Runnable) 상태에 있게 된다.실행 대기 상태에 있는 스레드는 CPU 스케줄러에 의해서 선택이 되면 실행을 하게 되는데,실행과 실행 대기 상태를 번갈아가며 반복하다가 run()메소드가 끝나면 종료하게 된다. 그런데 실행상태에서 실행 대기로 가지 않고 일시 정지 상태로 가는 경우가 있다.일시 정지 상태에 있는 스레드는 다시 실행 대기 상태로 가고, 실행 대기 상태에서 CPU스케줄러의 선택을 받아서 다시 실행을 하게 된다. 스레드 클래스에는 상태에 대한 열거형 Thread.State를 중첩 클래스로 정의해 놓았는데Thread.Sta.. 이전 1 2 3 다음