스레드를 대기 풀로 이동시키는 메서드
어떤 작업 끝난 이후에 나를 처리해줘! 라는 의미로 사용
강제로 runnable(실행할 수 있는 상태)로 만들어주는 것
동일한 우선순위를 가진 다른 스레드에게 실행을 양보하고 즉시 runnable 상태로 변경됨
일반 스레드의 작업을 돕는 보조적인 스레드
다른 스레드에 종속되는 스레드, 다른 스레드가 끝나면 종료됨
setDeamon()메서드 사용하고 데몬 스레드가 생성한 스레드는 모두 데몬스레드가 된다.
구구단 클래스 생성
메인에서 실행 ( sleep을 주지 않으면 메인이 바로 끝나기 때문에 t1,t2 스레드가 실행하지 못하고 종료됨 = 데몬스레드 기능)
바로 종료되는 것 확인
account 클래스 - 잔고 기능
client 클래스 - 인출 기능
main 클래스
스레드 하나가 인출 처리하는 동안 약간의 대기시간(sleep)이 있는데 그 사이에 다른 스레드에서 인출을 하고, sleep이 끝나고 또 -계산을 하게 되어 잔고가 - 나올 가능성이 있음( 공유 스레드의 문제점)
해결방법은 동기화 처리를 해주면 된다.
공유 구간에 대해 현재 사용하고 있는 스레드를 제외하고 다른 스레드는 사용하지 못하도록 막는 것
객체의 lock을 첫번째 스레드가 가져가서 사용하면 두번째 스레드는 첫번째가 반납할때까지 기다렸다 사용해야함
account 클래스의 withdraw 메서드에 synchronized 써주면 잔고가 음수로 떨어지지 않는다.
동기화의 비효율성을 보완하기 위한 것
wait - notify/All 호출하기 전까지 현재 스레드 waiting 상태로 유지
notify - 객체 락이 필요한 스레드 하나를 waiting - > runnable 상태로 변경
notifyAll - 객체 락이 필요한 모든 스레드를 waiting - > runnable 상태로 변경
미리 여러개의 스레드를 만들어서 pool에 저장해놓고 사용하는 것(커넥션 풀과 비슷)
스레드 필요하면 풀에 있는 스레드 중 하나 사용하고 작업 끝나면 스레드 종료시키지 않고 풀에 반납 - > 스레드 생성과 소멸에 드는 비용 크게 절감 가능