2009-09-10 2 views
1

여기 내 요구 사항을 간소화 된 버전입니다지연된 스레드 작업자와 함께 Java에서 정기적 인 작업을 예약 하시겠습니까?

저는 Java 클래스를 가지고 있습니다. 메서드를 포함하는 프로세서는 파일 서버에 연결하고 파일을 저장 한 후에 bigProcess()가 파일 서버에 연결한다는 것을 말합니다. DB 및 이후에 다른 테이블의 일부 DB 필드를 업데이트합니다.

다운로드 파일과 같은 각 하위 작업에 대해 DB에 저장하고, t1 등의 필드를 업데이트합니다. 다른 방법을 사용합니다.

프로세서 클래스는 2 시간마다 호출되며 각 호출에 대해 약 30-40 개의 요청을 처리해야합니다. 퍼포먼스를 향상시키기 위해 각 요청마다 새로운 스레드 (30 ~ 40 개의 스레드)를 계획하고 있으며 각 스레드는 bigProcess 메소드를 호출합니다.

이제 bigProcess() 메서드에서 코드 블록을 동기화해야합니다 (여기서는 업데이트 필드 메서드가 걱정됩니다.) 일부 업데이트 메서드는 selecte f1, f2, f3과 같은 행을 잠급니다 업데이트를 위해 t1에서 필드 f1, f2의 값을 & f3으로 설정하고 커밋을 발행합니다.

참고 : bigProcess() 메서드는 Processor 클래스의 인스턴스 변수를 사용하지 않습니다.

답변

3

BigProcess를 Callable으로 지정하십시오. Executor 또는 ExecutorService에 제출하면 Future이 반환됩니다. 30-40 스레드에서 future.get()을 수행하면 Callable이 완료 될 때까지 스레드가 차단됩니다. 또는 Callable이 완료되면 즉시 결과를 반환합니다.

이 작업을 수행하는 또 다른 방법은 스레드 풀을 만들어 스레드 풀에 모든 작업을 제출하는 것입니다. 일단 모든 작업이 제출되면 종료하고 종료를 기다립니다.

당신이 (작업 A가 완료 될 때까지 작업 B는 할 수없는 등)에 의존 작업이있는 경우
ExecutorService threadPool = Executors.newFixedThreadPool(40); 
// submit work 
threadPool.shutdown(); 
try { 
    threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
} catch (InterruptedException e) { 
    // do something 
} 

다음 등 작업 A로부터 Future와 함께 작업 B를 만들 : 그것은 다음과 같이 보입니다.

모든 것이 일시적이기 때문에 나는이 접근법을 좋아합니다. 데이터베이스의 단일로드의 경우 모든 프로세스가 작성, 실행 및 폐기됩니다. 지속적 스레드 풀 생성을 시작할 때 또 다른 잠재적 인 문제가 생기며 진행 상황을 해결하는 것이 더 어렵습니다.

+0

의견을 보내 주셔서 감사합니다. 이 솔루션은 JDK 1.5 이상에 적합합니다. 하지만 JDK 1.4.2를 사용하고 있습니다. 대체 방법을 제공해 주시겠습니까? –

+0

본인은 직접 시도하지 않았지만 http://commons.apache.org/sandbox/threadpool/는 위와 비슷한 해결책을 제시합니다. – Buhb

1

메서드를 동기화해야하는지 여부는 이러한 메서드가 실제로 수행하는 작업에 따라 다릅니다. 일반적으로 데이터베이스의 단일 파일 또는 단일 테이블 (실제로 쓰고 읽는 것)과 같이 여러 스레드에서 사용되는 리소스가있는 경우 동기화해야합니다. 실행중인 모든 프로세스가 서로 간섭하지 않으면 동기화 할 필요가 없습니다.

+0

예 스레드는 공통 테이블 인 t1과 t2를 사용합니다. 그러나 어떤 테이블의 동일한 행에서도 두 개의 스레드가 작동하지 않습니다. 이 경우 동기화가 필요합니까? –

+0

또 달라집니다. 처리 중 스레드 중 하나가 데이터베이스를 일관성없는 상태로 두어 다른 스레드가 올바르게 작동하지 않으면 동기화해야합니다. 스레드가 데이터베이스를 업데이트하는 순서가 중요하지 않으면 동기화가 필요하지 않을 수 있습니다. – Bombe

관련 문제