inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

사용자 스레드 vs 데몬 스레드

현재 제가 겪고 있는 상황인데 조언 부탁드립니다.

547

AAPPII

작성한 질문수 4

0

SpringBoot 에서 멀티 스레드로 크롤러가 돌아가는 프로젝트 입니다.

 

junit 테스트 코드를 통해 크롤러가 10개 정도 게시판 페이지를 정상적으로 가져오는지 확인하려고 하는데요.

 

현재 작성된 테스트 케이스는 아래와 같습니다.

@Test

void crawlerTest() {

// 크롤링 시작

crawlerRun();

 

while(스레드풀 작업 종료됐나??) {

// 작업이 안끝났으면

Thread.sleep(5000);

}

}

 

while 문이 있으면 정상적으로 10개의 게시판 페이지를 크롤링한 이후 DB에 적재됩니다.

 

다만 강의를 보면서 while 문이 없어도 되지 않을까 생각해서 삭제하거나 주석처리하면 올바르게 동작하지 않습니다.

 

[while 문 제거 후]

디버깅을 통해 값이 제대로 들어오는지 확인하면서

테스트 케이스를 돌리면 4~5 개정도만 DB 에 크롤링한 데이터가 저장되고 갑자기 오류도 없이 테스트가 종료됩니다.

 

디버깅없이 그냥 실행시키면 6개 정도 DB에 저장되고 테스트가 종료됩니다.

 

crawlerTest() 라는 테스트 코드가 Main Thread 라고 쳤을 때 다른 Thread 들은 정상적으로 동작 중이어야 하지 않나요..?

 

아니면 Spring 환경이라서 이런 문제가 발생하는 것인지

junit 테스트 코드라서 이런 문제가 발생하는건지 궁금합니다!

( Daemon Thread 는 아닙니다! )

java 동시성 multithread synchronisation

답변 2

1

식빵

저도 예전에 비슷한 상황을 마주친 적이 있어서 질문을 올렸고,
스스로 답을 찾은 적이 있습니다. 해당 질문 링크를 공유합니다.

https://www.inflearn.com/questions/567543

 

추가적으로 이런 일정 시간 대기 또는 비동기 동작에 대한 Junit 테스트를 하고 싶다면

GitHub - awaitility/awaitility: Awaitility is a small Java DSL for synchronizing asynchronous operations

을 알아보시면 좋을 거 같습니다.

1

정수원

음..
이 부분은 테스트 스레드에서 수행하는 메카니즘과 메인 스레드에서 수행하는 메카니즘이 다르거나 여러 내부적인 연결고리가 있을 수 있습니다.
당장 메인 스레드에서 테스트 했을 때 그런 현상이 발생하지 않는다면 말이죠..
사실 JVM 이 테스트 스레드가 수행중인 메서드가 종료되었을 때 다른 유저 스레드를 강제로 종료시키지는 않습니다.

이 부분은 저도 정확한 원인을 좀 더 찾아 봐야 겠지만 테스트 스레드가 일반적으로 우리가 알고 있는 유저 스레드의 흐름에 좀 더 특수성을 가지도록 설계되어 있을 수도 있습니다.

좀 더 서치가 필요할 것 같습니다.

멀티스레드 단일스레드

0

56

0

new Condition 부분 질문

0

83

1

13:00 강의 내용 이해 질문

0

99

1

강의 출시 질문 있습니다.

0

117

1

InterruptedExceptionThreadStopExample 질문입니다.

0

94

2

instance.getMyField()의 값이 왜 다른가요?

0

115

1

해당 강의 내용 무단 도용 신고

0

211

2

Thread Waiting 상태 관련 질문 드립니다.

0

186

1

단일연산변수 api

0

126

0

synchronized 블럭과 메인메모리 반영

0

147

0

실무에서 자바가 제공하는 락을 사용하는 경우

1

243

1

뮤텍스나 세마포어는 busy waiting이 없는 게 맞을까요?

0

159

1

16:50부분에서 타입락 질문드립니다.

0

110

2

16분 7초 뮤텍스 코드 관련해 질문드립니다.

0

160

2

동기화가 보장된다고 하더라도 스레드간 데이터 불일치가 발생할 수 있지 않나요??

0

199

2

리액티브-part2

0

180

2

문자열 풀 값을 이용한 String 변수

0

207

2

스레드 라이브러리는 커널과 같은 역할을 하지 못하나요?

0

173

1

자식 프로세스를 쓰는 이유

0

186

1

커널 모드 전환시 질문이 있습니다!

0

146

1

[공유] setName 시 threadName이 1부터 시작하는 이유

0

178

1

synchronized = 모니터

0

285

2

Thread의 Context Switching 문의드립니다.

1

257

1

동기 & 논블록킹 질문 드립니다.

0

232

2