스레드 관련 질문 드립니다.
파랑새
첫번째는 스레드 동기화에 관련된 질문입니다.
동기화를 시킬 때, synchronized, wait, notify, notifyAll를 사용하는 방법과 Lock 또는 ReentrantLock을 사용하는 방법이 있습니다.
각각의 장단점이 있을텐데 주로 많이 사용하는 방법은 무엇인가요?
두 번째는 Thread.sleep에 관한 내용입니다.
A라는 배열이 있고, 데이터를 처리하는 Control 객체가 있습니다.
큐에 객체를 집어 넣고 Control 객체에 요청하면, Control 객체는 큐에서 객체를 꺼내와서 처리하고 A의 값을 변경합니다.
그리고 나서 변경된 A 배열로 다른 연산을 수행합니다. Control 객체가 연산을 수행하는 데 시간이 걸리므로
찾아보니 보통 Thread.sleep(1000); 과 같이 Thread를 잠시 대기시키는 방법을 사용합니다.
이렇게 하는 방법 말고while(큐.length != 0) {} 처럼 큐의 길이가 0이 될때까지 무한루프를 돌려서 사용하거나
while(큐.length != 0) { Thread.sleep(100); } 이런식으로 sleep을 짧게 주고 큐의 길이를 확인하는 방법으로 해도 되는지 조언 바랍니다.
-
꽃내음
두번째 항목만 답변 드리겠습니다.
큐를 어떤 것으로 만드냐가 관건입니다.
synchronized를 걸어주셔야 원하는 결과를 얻으실 수 있고요
슬립 주는건 아닌 듯 합니다.
synchronized를 걸어주는 방식도 잠깐씩 Lock이 걸린다고 보면 되고요
Concurrent Package 쪽을 사용하시는게 가장 좋은 방법일 듯 합니다. -
그녀는귀여웠다
synchronized 를 사용하는 방법이 주류이고 5.0 에서 Lock 관련 클래스들이 추가되어 여러 고급 스레드 기능을 지원하고 있습니다. 많이 사용된 건 역시나 synchronized 겠지요.. ReentrantLock 은 5.0 에나 추가 됐으니까.. 버전을 고려해야 한다면 synchronized 로 하시고 그 외에는 후자로 하시지요.. sleep 은 스레드를 사용하는 별로 멋지지 않은 방법입니다. 그리고 프로세스를 보니 굳이 sleep 을 사용