프로세스와 쓰레드
프로세스 : 실행 중인 프로그램, 자원(resources)과 쓰레드로 구성
->cpu,메모리...
쓰레드 : 프로세스 내에서 실제 작업을 수행, 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
쓰레드 종류 - 싱글 쓰레드, 멀티 쓰레드
멀티 쓰레드의 장단점
대부분의 프로그램은 멀티쓰레드로 작성되어 있다.
장점 : 시스템 자원을 보다 효율적으로 사용 가능, 사용자에 대한 응답성 향상, 작업이 분리되어 코드가 간결해 진다.
단점 : 동기화(synchronization)에 주의해야 한다, 교착 상태(dead-lock)가 발생하지 않도록 주의 필요, 각 쓰레드가
효율적으로 고르게 실행될 수 있게 해야 한다.
쓰레드의 구현과 실행
두 가지 방법이 있다.
1. Thread 클래스를 상속
class MyThread extends Thread{
public void run() {}
2.Runnable 인터페이스 구현
class MyThread2 implements Runnable{
public void run(){}
->쓰레드를 실행한 후 start()를 호출해야 쓰레드가 작업을 수행한다.
->하지만 start()를 호출해도 바로 시작되는 것이 아니라 시작 가능한 상태가 되는 것이다.
쓰레드의 우선 순위
작업의 중요도에 따라 쓰레드 우선 순위를 다르게 하여 특정 쓰레드가 더 많은 작업 시간을
갖게 할 수 있다.
void setPriority(int newPriority) 쓰레드의 우선 순위를 지정한 값으로 변경
int getPriority() 쓰레드의 우선 순위를 반환
데몬 쓰레드
일반 쓰레드(non-daemon thread)의 작업을 돕는 보조적인 역할 수행
일반 쓰레드가 모두 종료되면 자동 종료된다.
가비지 컬렉터, 자동 저장, 화면 자동 갱신 등에 사용된다.
무한 루프와 조건식을 이용해서 실행 후 대기하다가 특정 조건이 만족되면
작업을 수행하고 다시 대기하도록 작성.
boolean is Daemon(boolean on)
- 쓰레드가 데몬 쓰레드인지 확인, 데몬 쓰레드이면 true 반환.
void setDaemon(boolean on)
- 쓰레드를 데몬 or 사용자 쓰레드로 변경
쓰레드 상태
NEW : 쓰레드가 생성 & 아직 start 호출 X
RUNNABLE : 실행 중 or 실행 가능한 상태
BLOCKED : 동기화 블록에 의해 일시 정지된 상태
WAITING, TIMED_WAITING : 쓰레드의 작업이 종료되지 않았지만 실행 가능하지 않은(unrunnable) 일시 정지 상태
TERMINATED : 쓰레드 작업이 종료된 상태
쓰레드 실행 제어 메서드
1.sleep() -static
-현재 쓰레드를 지정된 시간동안 멈추게 한다.
-예외 처리 필요(InterruptedException이 발생하면 깨어남)
-특정 쓰레드를 지정해서 멈추는 것은 불가능하다.
2.interrupt()
-대기 상태(WAITING)인 쓰레드를 실행 대기 상태(RUNNABLE)로 만든다.
-void interrupt() 쓰레드의 interrupted 상태를 false->true로 변경
-boolean isInterrupted() 쓰레드의 interrupted 상태를 반환.
-static boolean interrupted() 현재 쓰레드의 interrupted 상태를 알려주고 false로 초기화
3.suspend(), resume(), stop()
-쓰레드의 실행을 일시 정지, 재개, 완전 정지 시킨다.
-void suspend() 일시 정지
-void resume() 실행 대기 상태로 재개
-void stop() 즉시 종료
**위 세 가지는 deprecated 되었으므로 직접 구현해야 한다.
public void suspend() { suspended = true;}
public void resume() { suspended = false;}
public void stop() { stopped = true;}
4.yield()-static
-남은 시간을 다음 쓰레드에게 양보하고 자신(현재 쓰레드)은 실행 대기한다.
-yield()와 interrupt()를 적절히 사용하면 응답성과 효율을 높일 수 있다.
5.join()
-지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다.
-void join() 작업이 모두 끝날 때까지
-void join(long millis) 천분의 일초 동안
-void join(long millis, int nanos) 천분의 일초 + 나노초 동안
쓰레드의 동기화 - synchronized
한 번에 하나의 쓰레드만 객체에 접근할 수 있도록 객체에 락(lock)을 걸어서 데이터의 일관성을 유지하는 것.
동기화의 효율을 높이기 위해 wait(), notify()를 사용
-> Object 클래스에 정의되어 있으며 동기화 블록 안에서만 사용할 수 있다.
-wait() : 객체의 lock을 풀고 쓰레드를 해당 객체의 waiting pool에 넣는다.
-notify() : waiting pool에서 대기 중인 쓰레드 중의 하나를 깨운다.
-notifyAll : waiting pool에서 대기 중인 모든 쓰레드를 깨운다.
예제
쓰레드를 구현하는 방법에는 Thread클래스로부터 상속받는 것,
Runnable 인터페이스 구현하는 것 두 가지가 있다.
이 코드를 Runnable 인터페이스를 구현하도록 변경하시오.
'📒 education archive > 🎀JAVA' 카테고리의 다른 글
자바 공부 기록(11)-LinkedList, ArrayList와 비교 (0) | 2021.08.19 |
---|---|
자바 공부 기록(10)-컬렉션 프레임웍,ArrayList (0) | 2021.08.19 |
자바 공부 기록(8)-다형성, 인터페이스, 예외처리 (0) | 2021.08.13 |
자바 공부 기록(7)-상속,오버라이드,일반 제어자 (0) | 2021.08.13 |
자바 공부 기록(6)-생성자,캡슐화,접근 제어자 (0) | 2021.08.13 |