문제

다음은 내 요구 사항의 단순화 된 버전입니다

메소드가 포함 된 Java Class Say Processor가 있습니다. .

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

프로세서 클래스는 2 시간마다 호출되며 각 호출에 대해 약 30 ~ 40 개의 요청을 처리해야합니다. Perfromance를 개선하기 위해 각 요청에 대한 새 스레드 (여기서 30 ~ 40 개의 스레드)에 걸쳐 새로운 스레드를 확보 할 계획이며 각 스레드는 BigProcess 메소드를 호출합니다.

이제 내 질문은 bigProcess () 메소드에서 코드 블록을 동기화 해야하는 것입니다 (여기서는 업데이트 필드 메서드에 대해 걱정됩니다. 일부 업데이트 메소드는 F1, F2, F3과 같은 행을 잠그는 것입니다. , 필드 F1, F2 & F3의 값을 설정하고 이슈 커밋)

참고 : method bigProcess ()는 클래스 프로세서의 인스턴스 변수를 사용하지 않습니다.

도움이 되었습니까?

해결책

큰 프로세스를 만드십시오 Callable. 당신이 그것을 an에 제출할 때 Executor 또는 ExecutorService 당신은 돌아옵니다 Future. 당신이한다면 future.get() 30-40 스레드에서 해당 스레드는 Callable 완료됩니다. 또는 Callable 완료되면 결과를 즉시 반환합니다.

이 작업을 수행하는 대안적인 방법 (내가 좋아하는)은 스레드 풀을 만들고 모든 작업을 스레드 풀에 제출하는 것입니다. 모든 작업이 제출되면 종료 및 종료를 기다립니다. 다음과 같이 보입니다.

ExecutorService threadPool = Executors.newFixedThreadPool(40);
// submit work
threadPool.shutdown();
try {
  threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
  // do something
}

종속 작업이있는 경우 (작업 B와 같은 작업 A가 완료 될 때까지 수행 할 수 없음) A로 작업 B를 만듭니다. Future 작업 A 등에서.

나는 모든 것이 일시적이기 때문에이 접근법이 마음에 듭니다. 데이터베이스의 단일로드의 경우 모든 프로세스가 생성, 실행 및 버려집니다. 지속적인 스레드 풀을 만들기 시작하면 또 다른 잠재적 인 문제가 발생하고 무슨 일이 일어나고 있는지 해결하기가 더 어렵습니다.

다른 팁

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top