2011-12-12 2 views
0

도서관 호출이 있는데, 예를 들어 Descriptor.compute(Molecule m)이라고합시다.실제로 스레드를 중지시키는 Java의 스레드 풀은 무엇입니까?

이 호출은 어떤 분자 (라이브러리의 버그) 영원히 중단 및 일부 분자를 들어, 오랜 시간에 대한 계산을 수행합니다. 모든 프로세서를 사용할 수 있도록 다중 스레드 또는 다중 처리 방식으로 서버에서 계산을 실행하고 싶습니다. 또한 컴퓨터가 어떤 분자에 대해서도 TIMEOUT보다 많은 시간을 소비하는 것을 원하지 않습니다.

compute 메서드는 isInterrupted()을 검사하지 않으므로 어디서나 기다리지 않고 Thread.interrupt() 호출에 응답하지 않습니다.

그래서 나는 이러한 유형의 작업을 중지에서 잘 작동 Thread.stop()을 사용할 필요가 있다고 생각합니다.

내 질문은 : 실제로 스레드를 중지 할 수있는 몇 가지 스레드 풀은 있습니까?

통신을 위해 ArrayBlockingQueue<Input>ArrayBlockingQueue<Result>을 사용하는 간단한 풀을 만들었습니다. 그러나, 나는 이상한 들 중 compute() 동안 나는 추적 할 수 없습니다 (이러한 예외는 null 스택 추적을 가지고 있습니다). 그래서 이미 존재하는 구현이 없는지 묻는 중입니다. 인터넷 검색은 과일을 가져 오지 않았고, 발견 한 모든 것은 interrupt입니다.

감사합니다.

편집 : 그건 그렇고, 도서관이 CDK입니다.

+0

흠 .. 그 예외를 던져 '계산'방법을 강요 하는가? 그렇지 않다면, '분자'내에 '계산'으로 빈번히 처리되고 segfault/AV를 강제하는 다른 분야가 있습니까? –

+0

각 Descriptor 구현은 다르게 동작합니다. 불행히도 예외를 던질 수있는 안전한 장소는 없습니다. – Krab

+0

"라이브러리 버그": 가까운 장래의 해결책은 아니지만 공개적으로 버그 리포트를 제출해야합니다 (이미 존재하는 경우 투표를해야합니다). – Thilo

답변

2

Java에서 스레드를 "종료"하는 좋은 방법은 없습니다. long disclaimer on the deprecated Thread#stop method을 읽어보십시오. 이 때문에 현대 API (예 : JDK의 ExecutorServices)는이 메소드를 사용하지 않습니다.

당신은 그 스레드가 인터럽트 및 종료 플래그를 확인해야한다. 당신이 M이 다른 스레드에서 null로 설정하면

+0

예, 알고 있습니다. 안타깝게도 Descriptor 인터페이스는 많은 클래스에서 구현되므로이 옵션이 아닙니다. – Krab

+0

이 경우 새 JVM 프로세스를 생성하여 이러한 계산을 수행 할 수 있습니다. 프로세스를 죽일 수 있습니다. – Thilo

+0

나는 이미 그것에 대해 생각했다. 파이썬의'다중 처리 (multiprocessing) '만큼 쉬운 것을 아십니까? 또는 고수준 IPC를 위해 Java에서 일반적으로 사용되는 도구는 무엇입니까? – Krab

관련 문제