'thread'에 해당되는 글 2건

  1. 2012.08.06 [Java] Semaphore(세마포어)를 이용한 ThreadExecutor (5)
  2. 2009.06.16 그냥 우연히 뭔가 해보다가.. (2)

DB에서 데이터를 읽어와서 네트워크를 통해 뭔가 작업을 한 후

다시 DB에 넣는 작업을 해야하는데 이 데이터의 건수가 많고 네트워크를 통한 작업에 시간이 좀 걸려서

이 부분을 스레드로 돌렸다.


기존에 알고 있는



Executor exec = Executors.newFixedThreadPool(10);


을 사용해서 실행을 했더니 DB에서 데이터 읽어오는 속도가 훨씬 빠른탓에

OOM 에러가 발생하기 시작... 처음에 도무지 왜 에러가 나는지 몰랐는데 확인해보니..

내부에서 스레드들이 처리하지 못 한 JOB을 Queue에 저장해 두는데 이게 너무 쌓이다보니

문제가 되었던듯 하여... 


자바병렬처리 프로그래밍 책을 다시 집어들었다.


미리 준비된 ExecutorService중 스레드가 추가 작업을 하지 못 할 때 

wait을 하는 API는 없다고 하여... 책을 더 뒤적거리고... ..

결국 세마포어를 활용한 BoundedExecutor라는 것이 있어서 이걸 살짝 고쳐서 사용.




다만...

semaphore의 release를 catch에서만 해주고 있어서

Runnable command에서 작업 종료 후 release 해주지 않으면 lock이 발생한다.


책에서는 Semaphore를 생성자에서 생성하도록 되어있는데

이런 경우 어떻게 Runnable command에서 작업 종로 후에 semaphore를 release 해줄 수 있는지

잘 모르겠어서... Semaphore를 외부에서 생성하고 Executor와 Runnable command에게 넘겨주는 방식으로

수정하였다.


Posted by 용식

main 메서드가 있는 일반적인 자바 어플리케이션을 만들어서 아래와 같이 돌려보았다..


이렇게 해서 돌려보니까...

main end.........................
Thread-0 : [0]
Thread-6 : [6]
Thread-5 : [5]
Thread-2 : [2]
Thread-7 : [7]
Thread-1 : [1]
Thread-4 : [4]
Thread-3 : [3]
Thread-10 : [10]
Thread-8 : [8]
Thread-9 : [9]
Thread-13 : [13]
Thread-17 : [17]
Thread-12 : [12]
Thread-16 : [16]
Thread-14 : [14]
Thread-18 : [18]
Thread-11 : [11]
Thread-15 : [15]
Thread-19 : [19]

이렇게 나온다..대충 예상했던대로...

그런데 Junit 으로 아래와 같이 만들어서 돌려보니까..

main end.........................

으로 끝나버린다. 이건 예상하지 못 한 결과...

어떤 차이로 이렇게 나오는건지..감도 못 잡것다.. ㅎㅎ;;;

junit이 test메서드를 실행하는 방법과의 차이 때문이겠지..?


풍대리님 계시면 바지 가랭이라도 붙잡고 늘어져서 여쭤봤을텐데.. ㅜ.ㅡ

가장 배워보고 싶은 부분 중 하나인데..
가장 어려운 부분 중 하나인것 같다. 그냥 냅둘까.. 쩝..
Posted by 용식
TAG JUnit, thread