자바 공부 기록(9)-쓰레드
my code archive
article thumbnail
반응형

프로세스와 쓰레드

프로세스 : 실행 중인 프로그램, 자원(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 인터페이스를 구현하도록 변경하시오.

 

 

 

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형