반응형
이전 포스팅에서 Thread 간에 동시성 이슈에 대해 다룬 글이 있다.
자세한 내용은 참고 포스팅 참고 바란다.
Thread 를 생성해서 사용할때 별도의 쓰레드 공간을 만들어서 사용하기 위해서는 아래 참고포스팅에있는 threadLocal을 사용하는 방식도 있지만 CountDownLatch 를 사용하는 방법도 있다.
예시 코드로 바로 설명하면
private CountDownLatch countDownLatch = new CountDownLatch(5); private Thread1 thread1; private Thread2 thread2; @GetMapping("/threadtest") public void threadStart() { thread1 = new Thread1(); thread1.start(); thread2 = new Thread2(); thread2.start(); } private class Thread1 extends Thread { @Override public void run() { System.out.println("Thread1 start"); try { // 5초 후 countDown() 호출 Thread.sleep(5000); System.out.println("5초 지났음."); countDownLatch.countDown(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private class Thread2 extends Thread { @Override public void run() { System.out.println("Thread2 start"); try { countDownLatch.await(); System.out.println("await end"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
일단 위와 같이 클래스 상단에 전역 변수로 CountDownLatch 를 5로 설정을 해두었다.
그리고 main에서는 thread1 과 thread2 를 호출하였고,
출력 결과
- 만약 countdownLatch가 없었다면
핑크색 라인인 print 가
thread1 start -> thread2 start -> await end -> (5초뒤) 5초 지났음
이 출력이 될것이다. - 하지만 countDownLatch의 설정에 따라
1번 호출하면 5초가 지난후 count 가 5에서 4로 내려가고
출력은
1번째 호출때 thread1 start -> thread2 start -> (5초뒤) 5초 지났음
2번째 호출때 thread1 start -> thread2 start -> (5초뒤) 5초 지났음
3번째 호출때 thread1 start -> thread2 start -> (5초뒤) 5초 지났음
4번째 호출때 thread1 start -> thread2 start -> (5초뒤) 5초 지났음
5번째 호출때 thread1 start -> thread2 start -> (5초뒤) 5초 지났음 ->
await end ->await end ->await end ->await end ->await end
이렇게 5번이 한번에 몰아서 호출이 되게 된다.
동시성 이슈를 해결할수 있는 또다른 방법중 하나이지만 여러개의 동시에 호출이 많이 들어올 경우에는 count 수를 잘 고려해야한다.
참고 포스팅
https://thenicesj.tistory.com/717
반응형
'IT > Java' 카테고리의 다른 글
[JUNIT Error] JUnit Platform version must be >= 1.8 to use a global embedded kafka server (48) | 2023.10.21 |
---|---|
no main manifest attribute, in Project-version.jar (52) | 2023.10.17 |
ThreadLocal (동시성문제) 사용법 및 주의사항 (49) | 2023.10.12 |
try-catch 예외처리 비용 (47) | 2023.10.11 |
Java에서 Thread (Runnable) (60) | 2023.10.10 |
댓글