누군가에게 이 글에 대한 메일을 받았습니다. if문 안에 wait를 썼는데 문제가 없나요? 이펙티브 자바 3판 item 80에서는 반복문 안에 wait를 쓰라는데. 사실 item 80은 wait notify 대신에 동시성 유틸리티를 쓰라는 겁니다. 그런데, 이 아이템에 언급된 것들 중에 짚고 넘어가야 할 문장들이 꽤 많은데, 그 중 하나는 반복문 안에 wait를 써라. 였습니다. 그만큼 어려우니, 그냥 동시성 유틸리티를 쓰라는 그림이였을지도 모르지만요. 메일로도 언급되었으니 짚고 넘어가겠습니다. 링크에 언급되었던 문제 상황을 바꾸어 보겠습니다. 2명의 생산자가 각각 10개의 item을 생산하고, 2명의 소비자가 각각 10개의 item을 소비합니다. 먼저, worker1 스레드 2개와 worker2 스레드..
스레드 검색 결과
Collection 중에는, SynchronizedMap이 있습니다. 대충 Synchronizedxxx라고 해 보겠습니다. 이것들은 어떠한 구조로 되어 있을까요? 먼저 Collcetions.Synchronizedxxx로 호출하는 것을 보아서는, 내부 class로 선언이 되어 있는 것을 알 수 있습니다. 이들은, Map 꼴의 맵 객체와, Object 객체인 mutex를 가지고 있습니다. 생성자 안에는, 인자로 넘겨받은 Map을 대입하는 부분이 있습니다. HashMap도 있고, TreeMap도 있을 텐데. 이렇게 해도 문제가 없나요? 고양이는 동물이고, 개도 동물이잖아요. 그러니 이들을 동물이라고 하는 것은 크게 무리는 없습니다. 다만, 넘겨받은 객체를 가지고 bark를 호출할 때에는 이야기가 달라지는데요...
stop 메서드로 쓰레드를 강제 종료하면 위험하다고 했습니다. 그러면 어떻게 종료하면 좋을까요? 몇 가지 방법이 있는데요. 그 중 하나는 Interrupt 메소드를 쓰는 것입니다. worker Thread가 vector에 수를 넣는 연산을 한다고 해 봅시다. 그런데, 중간에 sleep을 넣어놓았습니다. 이 때 worker Thread에 Interrupt를 걸면 어떻게 동작하는지 봅시다. Main이 단위시간 1동안 sleep를 하고, Int를 출력합니다. 그리고 w1에 Interrupt를 보내는데요. 공식 문서에 나온 이 함수의 설명을 빌리면, 아래와 같습니다. 여기서 중요한 키워드를 뽑아보면, blocked, 인터럽트 status, receive, 인터럽트 예외 정도가 있습니다. wait나 join, s..
이번 시간에는 Java의 yield 메서드에 대해서 알아보도록 하겠습니다. 사실, 이것은 백준 사이트에서 yield 관련한 질문이 들어와서 레퍼런스 보면서 조금이나마 알게 되었습니다. 물론, 그 질문에 대한 답은 pc 레지스터와 쓰레드가 어떤 영역을 독립적으로 가지는지에 대해서 찾아보세요. 였지만요. 일단 이 함수는, 설명부터 보는 게 중요할 듯 싶어요. 레퍼런스 사이트에 있는 설명 중 일부만 보도록 하겠습니다. current thread와 스케쥴러가 나오고, 힌트가 나옵니다. 정확하게 해석은 못 하겠지만, 현재 돌고 있는 쓰레드에 대한 무언가의 힌트인 것으로 보여요. 계속 보면 is willing to yield가 나오는데, 양보를 한다는 것이에요. 무엇을? 그것의 current use를. 쓰레드가 프..
오늘은 Java에서 쓰레드를 생성하고 실행하는 방법에 대해서만 알아보도록 하겠습니다. Runnable을 매개값으로 하는 Thread 생성자를 호출하거나, 아니면 worker가 Thread를 상속하는 방법 2가지가 있는데요. 이 둘을 먼저 알아보도록 하겠습니다. 코드를 컴파일 하고 실행을 합니다. static void main(String args[]); 이 친구가 있는데요. 이 친구를 실행하고 종료하는 쓰레드를 메인 쓰레드라고 합니다. 그런데, worker를 하나 더 만들 수 있어요. 즉, Main 실행 흐름만 만드는 것이 아니라, 다른 역할을 하는 스레드 또한 만들 수 있는데요. 예를 들어서, Main에서 게임의 전체적인 알고리즘 같은 것을 수행한다면, Worker에서 배경 음악을 재생한다던지. 그런 ..
최근댓글