문제

문제를 해결하기위한 Java에서 상당히 표준 메커니즘이 있습니다.

  • 작업 항목은 특정 시간에 실행해야합니다.
  • 그런 다음 각 작업 항목은 조건이 사실이되기를 기다려야합니다.
  • 작업 품목은 취소 할 수 있어야합니다

내가 사용하는 솔루션은 다음과 같습니다.

  1. 작업 항목을 예약 할 수있는 단일 스레드 스케줄러가 있어야합니다
  2. 가지고있다 ExecutorService (멀티 스레드 일 수 있음)
  3. 각 예정된 작업 품목은 실제 작업을 다음에 제출합니다. ExecutorService. 반환 Future 지도에 캐시됩니다. 작업이 완료되면 캐시에서 미래를 제거하는 데 완료 서비스가 사용됩니다.
  4. 캐시 된 선물을 통해 항목을 취소 할 수 있습니다

물론, 내 집행 인은 내가 기대할 것으로 예상되는 차단 작업 품목의 수만큼 커야하지만 실제로는 문제가되지 않습니다.

이제 스칼라로 코딩하고 배우 프레임 워크를 사용하고 있습니다. 내 작업 항목이 배우에게 전송 된 이벤트에서 캡슐화 될 수 있다고 가정합니다.

  1. 특정 시간 동안 작업 항목을 예약하는 데 어떤 메커니즘을 사용하겠습니까?
  2. 작업 항목이 액터에게 전송 된 이벤트 인 경우, 백킹 스레드 풀이 동시에 차단할 수있는 품목 수보다 더 큰지 확인하려면 어떻게해야합니까?
  3. 이전에 예정된 작업 품목을 취소하려면 어떻게해야합니까?
도움이 되었습니까?

해결책

특정 시간 동안 작업 항목을 예약하는 데 어떤 메커니즘을 사용하겠습니까?

java.util.concurrent.scheduledExecutorService를 사용합니다.

작업 항목이 액터에게 전송 된 이벤트 인 경우, 백킹 스레드 풀이 동시에 차단할 수있는 품목 수보다 더 큰지 확인하려면 어떻게해야합니까?

이것은 평행의 노력을 물리 치는 디자인으로 나를 놀라게합니다. 차단 및 글로벌 상태를 최소화하거나 제거하십시오. 이것들은 종합성과 확장성에 대한 장벽입니다. 예를 들어, 파일이 도착하기를 기다린 다음 행위자에게 이벤트를 시작하는 단일 전용 스레드를 고려하십시오. 또는 비동기 비 블로킹 I/O에 대한 java.nio를보십시오.

여기서 귀하의 요구 사항을 완전히 이해하지 못하지만 I/O 이벤트를 찾는 단일 스레드/액터가있을 수 있습니다. 그런 다음 예정된 "작업 항목"으로 비 블로킹 액터를 만드는 일정을 예약하십시오. 해당 액터가 I/O 스레드/액터에 등록하여 관심있는 I/O 이벤트에 대한 메시지를 받도록하십시오.

이전에 예정된 작업 품목을 취소하려면 어떻게해야합니까?

ScheduledExecutorService 미래를 반환합니다. 당신이 가진 것은 그 점에서 나쁜 디자인이 아닙니다. 지도에서 수집하고 Future.Cancel ()을 호출하십시오.

다른 팁

예정된 배우 목록이있는 스케줄링 배우가있을 수 있으며 actor.receivewithin () 매 초마다 일어나서 실행 준비가 된 배우에게 메시지를 보냅니다. 스케줄링 배우도 취소를 처리 할 수도 있습니다. 또 다른 옵션은 모든 액터가 일정을 중앙 집중화하는 대신 수신자 ()로 자체 일정을 직접 처리하도록하는 것입니다.

블로그 게시물 에이 문제에 대한 논의가 있습니다. 스칼라의 스케줄러와 같은 간단한 크론.

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