멀티 스레드 개념프로세스와 스레드운영체제에서는 실행 중인 하나의 애플리케이션을 프로세스라고 부르며 사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당 받아 애플리케이션의 코들르 실행하는데 이것을 프로세스라고 부른다. Show
멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 말하고 운영체제는 멀티 태스킹을 할 수 있도록 CPU 및 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행시킨다.
메인 스레드모든 자바 애플리케이션은 메인 스레드가 main() 메서드를 실행하면서 시작된다.
작업 스레드 생성과 실행멀티 스레드로 실행하는 애플리케이션을 개발하려면 먼저 몇 개의 작업을 병렬로 실행할지 결정하고 각 작업별로 스레들르 생성해야 한다.
Thread 클래스로부터 직접 생성
Thread 하위 클래스로부터 생성Runnable로 만들지 않고 Thread의 하위 클래스로 작업 스레드를 정의하면 작업 내용을 포함시킬 수도 있다.
스레드의 이름스레드는 자신의 이름을 가지고 디버깅을 할 때 어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 가끔 사용된다.
스레드 우선순위스레드의 구분
스케줄링 방식
동기화 메서드와 동기화 블록공유 객체를 사용할 때의 주의할 점싱글 스레드 프로그램은 한 개의 스레드가 객체를 독차지해서 사용해도 되지만, 멀티 스레드는 객체를 공유해야 하는 경우가 있다. 동기화 메서드 및 동기화 블록스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없도록 하려면 스레드 작업이 끝날 때까지 객체에 잠금을 걸어서 다른 스레드가 사용할 수 없도록 하는 방법이 있다.
스레드 상태스레드 객체를 생성하고, start() 메서드를 호출하면 곧바로 스레드가 실행되는 것처럼 보이지만 사실은 실행 대기 상태가 된다. 실행 상태에서 일시 정지 상태가 되기도 하는데 스레드가 실행할 수 없는 상태이다.
스레드 상태 제어실행중인 스레드의 상태를 변경하는 것을 스레드 상태 제어라고 하며 정교한 스레드 상태 제어가 되지 않으면 프로그램은 불안정해져서 먹통이 되거나 다운된다.
데몬 스레드데몬 스레드는 주 스레드의 작업을 돕는 보조적인 역할로 주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료된다.
스레드 그룹스레드 그룹은 관련된 스레드를 묶어서 관리할 목적으로 이용되며 JVM이 실행되면 system 스레드 그룹을 만들고, JVM 운영에 필요한 스레드들을 생성해서 system 스레드 그룹에 포함시킨다.
스레드 풀갑작스런 병렬 작업의 폭증으로 인한 스레드의 폭증을 막으려면 스레드 풀을 사용해야 한다.
스레드 풀은 데몬 스레드가 아니기 때문에 main 스레드가 종료되더라도 작업을 처리하기 위해 계속 실행 상태로 남아있으므로 스레드풀을 종료시켜 스레드들이 종료 상태가 되도록 처리해야 한다.
작업 생성Runnable의 run() 메서드는 리턴 값이 없고 Callable의 call() 메서드는 리턴 값이 있다.
작업 처리 요청
블로킹 방식의 작업 완료 통보Future 객체는 작업 결과가 아니라 작업이 완료될때까지 기다렸다가(지연했다가=블로킹되었다가) 최종 결과를 얻는데 사용되어 지연 완료 객체라고 하고 이를 작업 완료 통보 방식이라고 한다. get() 메서드를 호출하면 스레드가 작업을 완료할 때까지 블로킹되었다가 작업을 완료하면 처리 결과를 리턴한다. 주의 할 점은 처리하는 스레드가 작업을 완료하기 전까지는 get() 메서드가 블로킹되므로 다른 코드를 실행할 수 없다.
submit() 메서드별 리턴 값
Future객체가 제공하는 메서드
리턴 값이 없는 작업 완료 통보 : submit(Runnable task) 메서드를 이용하면 된다. 리턴 값이 있는 작업 완료 통보 : 작업 객체를 Callable로 생성하면 된다. 작업 처리 결과를 외부 객체에 저장스레드가 작업 처리를 완료하고 외부 Result 객체에 작업 결과를 저장하면 애플리케이션이 Result 객체를 사용해서 어떤 작업을 진행할 수 있게 되며 대개 Result 객체는 공유 객체가 되어, 두 개 이상의 스레드 작업을 취합할 목적으로 이용된다.
작업 완료 순으로 통보스레드 풀에서 작업 처리가 완료된 것만 통보받는 방법이 있는데 CompletionService를 이용하는 것이다. CompletionService는 처리 완료된 작업을 가져오는 poll()과 task()메서드를 제공한다.
콜백 방식의 작업 완료 통보애플리케이션이 스레드에게 작업 처리를 요청한 후, 스레드가 작업을 완료하면 특정 메서드를 자동 실행하는 기법을 말하며 자동 실행되는 메서들르 콜백 메서드라고 한다. ExecutorService는 콜백읠 위한 별도의 기능이 제공되지 않지만 Runnable 구현 클래스를 작성 할 때 콜백 기능을 구현할 수 있다. |