2021.11.25 TIL

crimy950·2021년 11월 25일
0

TIL

목록 보기
25/30
post-thumbnail

Thread 활용 정리

두 thread WashAI, ShampooAI는 한 classs Table을 공유하고있다. 각각 tbl이라는 Table 포인터로 같은 인스턴스를 가리키고 있다. Table에 dishes라는 ArrayList를 이용해 처리해야 할 일을 추가하고, Shampoo에서 먼저 on 시킨 String d = dish "i" 를 Wash 에서 off 시켜야 하는 구조다. 이 코드를 실행시키면

위와 같이 on과 off 가 독립적으로 동작하기때문에 시간상 on: Text출력 - tbl.on(); 작동 과정에서 Text를 출력하고, tbl.on()을 하기 전 tbl.off()가 동작해서 ArrayList의 구조상 나중에 추가된 dish가 off 돼야하지만 그렇지 않은 결과가 나온다. 이를 해결하기 위해서는 역시 동기화를 시켜 tbl.on();이 작동하고 tbl.off();가 작동하도록 해줘야한다.

사용한 방법과 다르게 class에서 Thread가 사용하는 함수에 동기화를 한다. on,off가 들어가는 내용에 this를 매개변수로 하여 동기화하면 Wash와 Shampoo를 한번에 처리할 수 있다. 이제 시간상 간섭이 되는 문제는 해결이 됐는데, 다른 문제는 on과 off가 되는 횟수는 고정돼있는데 on된 dish가 없는 상태에서 off를 하면 비어있는 ArrayList 에서 remove를 하게된다. 그럼 최종적으로 i=300에 달했을때 동작을 종료하면 ArrayList에는 on된 dish가 남게된다. 이를 해결하기 위한 조건을 추가한다.

여기서 새로운 method가 등장하는데 wait과 notify다. wait은 Thread가 동작을 중지하고, notify는 동작을 계속하게 한다. dishes 가 비게되면, wait시켜서 off()가 계속해서 null값을 출력하지 않게 하고, dishes에 5개가 쌓이면, on()이 계속해서 너무 많은 dish를 dishes에 누적하지 않게 한다.

ThreadPool
ThreadPool은 은행창구와 같이 같은 대기열을 공유하는 여러 Thread가 반복적으로 일을 하나씩 처리해나가는 것이다.

IWork라는 인터페이스를 만들어, WorkQueue class를 이용해서 처리하게될 일들이 implements할 대상으로 삼는다. method doIt을 통해서 해당 일을 정의하고, WorkQueue를 통해 그 일들을 관리한다. WorkQueue 의 LinkedList queue 역시 <IWork>자료형을 갖는 List가 된다.해당 List에 각 method enqueue 와 dequeue 를 통해서 해야할 일을 추가하고, 제거한다. WorkThread class는 Thread를 상속받아 만들어진 일을 하게 될 Thread 의 바탕이될 class다. queue와 name 이라는 변수를 갖는데 이 queue 역시 WorkQueue 를 가져, 처리해야 할 일을 저장하게 된다.
main에서 가장 먼저 Thread의 이름을 지정하고, 해당이름을 갖는 Thread를 하나하나 생성한뒤, 일을 배정하는 for문을 3가지 추가한다.

0개의 댓글