23.04.05

이준영·2023년 4월 5일
0

join

스레드를 대기 풀로 이동시키는 메서드
어떤 작업 끝난 이후에 나를 처리해줘! 라는 의미로 사용

interrupt

강제로 runnable(실행할 수 있는 상태)로 만들어주는 것

yield

동일한 우선순위를 가진 다른 스레드에게 실행을 양보하고 즉시 runnable 상태로 변경됨

데몬 스레드

일반 스레드의 작업을 돕는 보조적인 스레드
다른 스레드에 종속되는 스레드, 다른 스레드가 끝나면 종료됨
setDeamon()메서드 사용하고 데몬 스레드가 생성한 스레드는 모두 데몬스레드가 된다.


구구단 클래스 생성

메인에서 실행 ( sleep을 주지 않으면 메인이 바로 끝나기 때문에 t1,t2 스레드가 실행하지 못하고 종료됨 = 데몬스레드 기능)


바로 종료되는 것 확인



공유 스레드


account 클래스 - 잔고 기능


client 클래스 - 인출 기능


main 클래스

스레드 하나가 인출 처리하는 동안 약간의 대기시간(sleep)이 있는데 그 사이에 다른 스레드에서 인출을 하고, sleep이 끝나고 또 -계산을 하게 되어 잔고가 - 나올 가능성이 있음( 공유 스레드의 문제점)




해결방법은 동기화 처리를 해주면 된다.

동기화 : synchronized

공유 구간에 대해 현재 사용하고 있는 스레드를 제외하고 다른 스레드는 사용하지 못하도록 막는 것
객체의 lock을 첫번째 스레드가 가져가서 사용하면 두번째 스레드는 첫번째가 반납할때까지 기다렸다 사용해야함


account 클래스의 withdraw 메서드에 synchronized 써주면 잔고가 음수로 떨어지지 않는다.



wait, notify, notifyAll

동기화의 비효율성을 보완하기 위한 것
wait - notify/All 호출하기 전까지 현재 스레드 waiting 상태로 유지
notify - 객체 락이 필요한 스레드 하나를 waiting - > runnable 상태로 변경
notifyAll - 객체 락이 필요한 모든 스레드를 waiting - > runnable 상태로 변경


스레드 풀

미리 여러개의 스레드를 만들어서 pool에 저장해놓고 사용하는 것(커넥션 풀과 비슷)
스레드 필요하면 풀에 있는 스레드 중 하나 사용하고 작업 끝나면 스레드 종료시키지 않고 풀에 반납 - > 스레드 생성과 소멸에 드는 비용 크게 절감 가능

profile
끄적끄적

0개의 댓글