네프 복습

오늘은 thread 챕터에서 subclassing thread class, implementing Runnable interface, returning information from a thread 부분을 복습했다. 앞의 두 파트는 컴응시간에 했던 스레드 실습과 내용이 거의 비슷했는데, 내가 예제들을 어려워했던 이유가 digest 내용이 낯설어서라는 걸 알게되었다. (물론 뒤에 내용들은 아직도 잘 모르는 부분 많음)

returning information from a thread 부분은 조금 어려워서 계속 보고 있는데, race condition을 해결하기 위해 polling과 callback에 대해 다뤘다.

polling은 상태를 주기적으로 검사해 일정 조건을 만족하면 처리하는 방법이다. 특정 조건을 만족할 때까지 끈질기게 계속해서 검사하는데, main thread가 job completion을 계속 확인하고 있어야 하기 때문에 다른 worker thread들이 일할 시간을 주지 않아 성능 저하를 야기한다. 또 작업이 끝나지 않을 수도 있고 CPU resource를 낭비한다. while(true)안에서 코드를 실행하고, 조건을 만족했을 때 break하도록 구현했다.

callback은 thread가 작업이 끝났을 때 자신의 creator를 호출해 main program한테 결과를 알리는 것이다. worker thread가 run하고 있을 동안 main program이 계속 돌고 있을 필요가 없기 때문에 polling의 문제를 해결했으나 callback 역시 스레드의 순서가 없다는 단점이 있다. 그 다음에 배운 Futures, Callable, Executors로 순서를 줄 수 있다.

callback 예제 코드부터 다시 공부하기~ 오랜만에 static 메소드를 봤는데 객체이름.메소드()라고 쓰는 실수를 했다.. ㅠ.ㅠ 그치만 자바를 복습하니까 좋다

PS

단지번호붙이기 문제를 풀었다.
지도에 몇 개의 단지가 있는지, 각 단지별로 몇 채의 집이 있는지를 출력하는 문제이다. 며칠 전에 복습한 connected component 생각이 나서 DFS로 풀었다.
처음에 구현할 때는 단지마다 번호를 붙여 벡터에 저장했는데, 어차피 단지와 단지끼리는 서로 연결되어 있지 않는데다 같은 장소를 두 번 이상 방문하지 않으므로 한 위치에서 탐색을 시작할 때, cnt값을 0으로 초기화 해주고 탐색이 끝난 후 (한 단지 내의 집들을 다 방문한 후)의 cnt 값을 벡터에 push하도록 수정했다.

Flood fill

어떤 위치와 연결된 모든 위치를 찾는 알고리즘. 위키에 의하면
Flood fill is an algorithm that determins the area connected to a given node in a multi-dimensional array. This algorithm looks for all nodes in the array that are connected to the start node by a path of the target colour and changes them to the replacement colour.

자세한 내용은 위키피디아 문서 읽어보기