2011-09-05 8 views
1

나는 자바로 멀티 스레드 게임을하고있다. 모듈 스레드를 중앙 스레드 관리자에서 가져와 여러 스레드에서 독립적으로 실행하는 여러 개의 작업 스레드가 있습니다. 일시적으로 아무 것도 실행하지 않으면 이러한 스레드를 일시 중지 할 수있게하고 싶습니다. 스레드 관리자에서 wait() 메서드를 호출 해 보았습니다 만,이 메서드는 그 뒤에 오는 notify() 호출을 무시하는 결과를 낳았습니다.요청시 Java 스레드를 어떻게 일시 중단합니까?

나는 그것도 조금 봤다. 단지 대부분의 사이트가 suspend(), pause() 등과 같은 함수를 참조한다는 것을 알게되었다. 이제는 java 문서 페이지에서 더 이상 사용되지 않는 것으로 표시되어있다.

일반적으로 요청에 따라 스레드를 일시 중지하거나 계속하는 방법은 무엇입니까?

답변

4

스레드의 동작을 정지 시키려면 sentinal 변수가 false로 설정된 스레드에서 if 블록을 사용할 수 있습니다. 스레드가 루프를 수행하는 경우이 방법이 가장 효과적입니다.

1

여러 가지 방법이 있지만 가장 일반적인 (IMO) 작업자 스레드는 작업 큐에서 wait()를 호출하고 작업 생성기는 notify()를 호출해야합니다. 이렇게하면 스레드 관리자가 아무 작업도하지 않고 작업 스레드가 중지됩니다. 예 : this article on thread pools and work queues.

2

어쩌면 나는 그 요점을 놓치고 있지만, 그들이 할 일이 없다면 왜 그냥 죽게하지 않을까요? 그런 다음 다시 할 작업이있을 때 새 스레드를 생성하십시오.

두 가지 방식으로 대화를하려는 것처럼 나에게 들립니다. 저의 겸손한 견해로는 중앙 스레드 관리자에게 작업 (또는 '모듈')을 요청할 책임이있는 작업 스레드를 갖거나 작업을 돌연변이시키고 작업 스레드를 시작하는 중앙 스레드 관리자를 가져야합니다.

대부분의 경우 작업자 스레드가 작업을 요청할 책임이 있습니다. 그런 다음 때로는 스레드 관리자에게 책임이 뒤집혀 근로자에게 잠시 동안 물어 보지 말라고 지시합니다. 나는이 책임이 오직 한 편에만 머물러 있다면 시스템은 더 단순해질 것이라고 생각한다.

그래서,이, 당신이 개발하고 무엇을 내 제한된 지식으로 주어진, 내가 제안 중 하나를 수행하고 진행 상황을 추적 할 물건이있을 때

이 작업자 스레드의 스레드 관리자 킥을 가지고, 그들이 끝날 때 죽게 내버려두고, 할 일이있을 때만 새로운 것을 만들어야합니다. 또는

다시 시도하기 전에 Thread.sleep()을 사용하여 일정 기간 동안 잠자기 상태로 작업 관리자를 폴링하는 일정 수의 기존 작업자 스레드가 있어야합니다. 이것은 나에게 꽤 낭비적인 것 같아서, 당신이 좋은 이유가 없다면 옵션 1에 기대지 않겠는가?

+0

좋은 점은 있지만, 모든 모듈이 실행될 때까지 기다려야 할 때 게임의 주 스레드를 잠자기 상태로 만들거나 깨울 수 있습니다. 또한 각 모듈 (예 : 인공 지능, 애니메이션, 3D 렌더러, 스크립팅)은 어쨌든 완성에 대한 피드백을 보내야하므로 왜 즉시 새로운 작업을 시도하지 않습니까? 당신은 공정한 포인트가 있습니다. 아프다. 끝까지 생각해라 :)하지만 결국에는 그 경계선은 내가 실제로 찾고 있었던 것이었다. – Bartvbl

+0

충분히 공정한 -하지만 나는 절대로 쓰레드를 전혀 사용하지 않아도 될 수 있다고 생각합니다. 네가 맞다. 기다리는 사람이 있으면 노동자가 다른 일을하지 말아야 할 이유가 없다. 나는 KarlP가 맞다고 생각한다 - ExecutorService를 사용하라. 자바가 이미 훌륭한 동시성 라이브러리를 가지고있을 때 바퀴를 재발 명할 필요가 없다. – Russell

+0

그 중 일부는 또한 이러한 것들에 대해 배우고 싶습니다. 프로그래밍이 현명하기 때문에 더 쉬울 수도 있지만, "전에 사용 해왔다"는 것입니다. 그리고 확실하게, 나는 한 지점에서 일을 할 수없고 더 많이 사용할 수있을 때 그들을 다시 만들 수 없다면 실이 완전히 죽게 할 수 있습니다. – Bartvbl

1

모듈을 사용할 수있을 때까지 당신이 정상적으로 종료

이 현재 스레드를 차단 할 수 있도록 시간 초과 대기에 대한 take()

또는 poll(time,unit)를 사용하는 모듈을 가져 차단 큐를 사용

관련 문제