지금까지의 예제에서는 단순 작업 작성, 스케줄 및 진행 보고를 설명했습니다. 작업 스케줄링 메커니즘은 실제로 지금까지 표시한 것보다 더 강력합니다. 우선순위, 지연 및 사용자 정의 스케줄링 조건을 사용하여 작업이 스케줄되는 방식을 더욱 더 정밀하게 제어할 수 있습니다.
작업 우선순위는 시스템의 다른 작업과 관련하여 작업의 중요성을 설정하는 데 사용될 수 있습니다. 작업의 우선순위를 설정하면 이미 실행 중인 작업에는 영향을 주지 않지만 다른 작업과 관련하여 대기 중인 작업이 스케줄되는 방법에는 영향을 줍니다. 작업의 우선순위는 다음과 같이 사전정의된 여러 우선순위 상수 중 하나일 수 있습니다.
작업의 기본 우선순위는 LONG입니다. 다음 스니펫은 이전에 사용한 일반 작업을 작성하지만 우선순위를 DECORATE로 설정하여 이 작업의 우선순위가 가장 낮은 레벨임을 표시합니다.
TrivialJob job = new TrivialJob(); job.setPriority(Job.DECORATE); job.schedule();
작업 스케줄 방법을 제어하는 또 다른 기술은 스케줄링 지연을 사용하는 것입니다. 스케줄링 지연은 작업을 스케줄할 때 지정할 수 있습니다. 작업이 스케줄되기 전에 지정된 시간(밀리초) 동안 지연됩니다.
TrivialJob job = new TrivialJob(); job.schedule(1000); // wait one second before scheduling
이미 대기 중이거나 일시 정지 중인 작업을 스케줄하는 하는 것은 아무 효과가 없습니다. 그러나 이미 실행 중인 작업을 스케줄하면 작업이 완료된 후에 재스케줄됩니다. 이것은 배경 폴링 루프와 같은 반복적인 작업에 편리한 메커니즘입니다. 작업이 실행 중인 동안 여러 번 재스케줄되면 가장 최근에 제공된 지연으로 한 번만 재스케줄됩니다. 다음 스니펫은 작업이 현재 반복을 완료한 이후 10초 동안 실행하도록 자체적으로 재스케줄하는 작업을 정의합니다.
class RepetitiveTrivialJob extends Job { public RepetitiveTrivialJob() { super("Repetitive Trivial Job"); } public IStatus run(IProgressMonitor monitor) { System.out.println("Running the job."); // reschedule after 10 seconds schedule(10000); return Status.OK_STATUS; } }
작업 클래스의 추가 프로토콜을 사용하면 작업이 스케줄되거나 실행되기 전에 사전 조건이 있는지 검사할 수 있습니다. 이 내용은 다음 예제에서 가장 잘 설명됩니다.
class JobWithPreconditions extends Job { ... public boolean shouldSchedule() { return super.shouldSchedule() && checkJobPreconditions(); } public boolean shouldRun() { return super.shouldRun() && checkJobPreconditions(); } ... }
shouldSchedule 메소드는 작업 관리자가 작업을 대기열에 배치하기 직전에 호출됩니다. 이 메소드를 사용하면 스케줄링에 대한 기본 사전 조건이 충족되지 않을 경우 작업이 작업 자체를 취소할 수 있습니다. 작업은 스케줄하기가 적절하지 않음을 표시하는 false를 리턴하게 됩니다. 마찬가지로 shouldRun 메소드는 작업 관리자가 작업을 실행하기 직전에 호출됩니다. 작업이 실행되기 전에 충족되어야 하는 모든 추가 조건을 이 시점에서 확인해야 합니다.