2012-05-02 2 views
0

나는 어떤 스레드를 생성하는 스레드를 생성하는 모듈을 작성 중이다. 그래서 전반적으로 나는 'Thread'를 사용하여 'Task'를 만들고 제출하는 'Resolver'클래스에 정보를 제공하는 'Manager'클래스를 가지고 있습니다.대기열에서 이미 생성 된 작업을 찾는 전략

Resolver에는 perticular 작업이 이미 생성되었는지 확인하기 위해 사용하고있는 무제한 대기열이있는 스레드 풀 실행 프로그램이 있습니다. 대기열에 이미 작업의 인스턴스가있는 경우 ThreadPoolExecutor를 사용하여 제거하고 새 작업을 다시 제출합니다. 이것은 새로운 작업이 '관리자'로부터 새로운 정보를 가져 오기 때문에 의도적으로 수행됩니다.

ThreadPoolexecutor를 사용하여 작업이 이미 대기열인지 확인합니다. 하지만 대기열의 성능에 대해 걱정이됩니다. 대기열에 30000 개가 넘는 작업 인스턴스가있을 수 있기 때문에 해시 맵이 더 나은 선택이라고 생각합니다.

대기열에 이미 생성 된 작업을 찾기위한 적절한 전략을 선택하도록 안내합니다.

+0

작업을 찾는 것보다는'Future.cancel (false)'를 사용하면 작업이 아직 시작되지 않은 경우 작업을 중지 할 수 있습니다. –

답변

0

너무 복잡한 구현을 구현하지 않는 한 문제가 발생할 것이라고 생각하지 않습니다. 프로파일 러를 사용하여 테스트를 실행하고 실제 문제인지 아닌지 확인하는 것이 좋습니다 ...

그러나 그렇다면 BlockingQueue의 고유 한 구현을 만들 수 있습니다 (ThreadPollExecutor로 전달 될 수 있음). 생성자 인수). 이 방법을 사용하면 BlockingQueue (표준 작업 대기열의 경우) 및 HashSet (빠른 포함 (...) 테스트의 경우)의 일부 구현을 만들 수 있습니다. 해당 컬렉션의 모든 작업에 대해 적절한 동기화를 기억하십시오. 모든 작업은 원자 적이어야합니다.

+0

감사합니다. BlockingQueue와 함께 가서 보류중인 태스크를 제거하기 위해 remove를 호출 할 것이다. 모든 작업이 원자 적이라고 말하면 동기화 된 메서드를 사용하여 원자화 작업을 수행하도록 권장합니까? 아니면 다른 더 좋은 넋? – user832096

+0

자신 만의 구현으로 클래스를 캡슐화하지 않는다면 동기화에 대해 걱정할 필요가 없습니다. – MikePatel

+0

예, 모든 방법을 동기화하는 것이 좋습니다. 또는 Lock (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/Lock.html)을 사용할 수도 있습니다. – altanis

관련 문제