본문 바로가기

자바공부

명품자바프로그래밍13장 요약, 스레드와 멀티테스킹

728x90
반응형

* 멀티스레딩은 하나의 응용프로그램이 여러 개의 스레드를 생성하여 여러 작업을 동시에 처리하는 프로그래밍 방식이다. 자바는 멀티스레딩을 지원한다.

 

* 자바 스레드는 JVM에 의해 관리되는 실행 단위 코드 블록이다.

 

* 하나의 JVM은 하나의 자바 응용프로그램만을 실행하며 자바 응용프로그램이 시작될 때 JVM이 실행을 시작하고 자바 응용프로그램이 종료하면 JVM도 함께 종료한다.

 

* 자바 스레드에 관한 정보는 스레드의 PC, 레지스터, 스레드 스택, 이름, ID, 상태 정보, 우선순위, 그룹 등이며 이들은 JVM에 의해 관리된다.

 

* main() 메소드는 JVM에 의해 만들어진 main 스레드의 스레드 코드이다.

 

* Thread 클래스를 상속받아 스레드 코드를 작성할 때는 run() 메소드를 오버라이딩하고 이곳에 스레드 코드를 작성한다. run() 메소드가 종료하면 스레드도 종료한다. 스레드를 동작시키기 위해서는 Thread의 start() 메소드를 호출하여야 한다.

 

* Runnable 인터페이스를 구현하여 스레드 코드를 작성할 때 역시 run() 메소드를 오버라이딩 하고 이곳에 스레드 코드를 작성한다. Runnable 객체를 Thread 클래스의 생성자에 넘겨주면서 Thread 객체를 생성한다. run() 메소드가 종료하면 스레드도 종료한다. 스레드를 동작시키기 위해서는 Thread의 start() 메소드를 호출하여야 한다.

 

* 스레드는 NEW, RUNNABLE, WAITING, TIMED_WAITING, BLOCK, TERMINATED의 6개 상태의 생명 주기를 가진다.

 

* 스레드는 JVM에 의해 철저히 우선순위 기반으로 스케줄링되며 동일한 우선순위에 대해서는 라운드 로빈 방식으로 스케줄링된다. 우선순위 최댓값은 10이고 최솟값은 0이며 보통 값은 5이다. main() 스레드의 우선순위는 5이며 자식 스레드는 부모 스레드의 우선순위를 물려받아 태어난다.

 

* 스레드가 타 스레드의 Thread 클래스 멤버 interrpt()를 호출하면 InterruptedException이 발생하며 타 스레드가 이 예외를 받아 단순 리턴하면 종료된다.

 

* 다수의 스레드가 공유 데이터에 대한 동시적 접근, 즉 경쟁 상태(race condition)가 발생하면 예기치 않은 잘못된 결과가 발생하므로 이를 해결하기 위해 스레드 동기화를 프로그램에 구현하여야 한다.

 

* synchronized 키워드는 메소드 전체나 코드 블록을 임계 영역 혹은 동기화 블록으로 지정하는데, 이때 한 스레드가 이 코드 블록에 먼저 진입하면 다른 스레드는 대기하게 된다.

 

* 스레드 동기화를 위한 다른 방법으로는 Object 클래스의 wait(), notify(), notifyAll()을 이용하는 방법이다.

한 스레드가 자신이 필요로 하는 자원을 다른 스레드가 사용 중인 경우 약속된 객체의 wait() 메소드를 호출하여 자원을 사용 중인 스레드가 깨워주기를 기다리는 상태에 진입한다.

자원을 다 사용한 스레드는 약속된 객체의 notify()나 notifyAll()을 호출하여 대기 상태에 있는 스레드를 깨워 작업을 진행하도록 한다.

반응형