Вы буквально хотите сравнить каждое изображение с другими? Каково приложение? Возможно, Вам просто нужны некоторая индексация и извлечение изображений на основе определенных дескрипторов? Тогда, например, можно посмотреть на стандарт MPEG-7 для Интерфейса Описания Мультимедийного контента. Тогда Вы могли сравнить различные дескрипторы изображения, которые будут не настолько точными, но намного быстрее.
Если все, что вам нужно сделать, это запускать каждые 20 секунд, Кварц - серьезный перебор. java.util.concurrent.ScheduledExecutorService
должно быть вполне достаточно для этого задания.
Служба ScheduledExecutorService
также предоставляет две семантики для планирования. «фиксированная скорость» будет пытаться запускать ваше задание каждые 20 секунд независимо от перекрытия, тогда как «фиксированная задержка» попытается оставить 20 секунд между концом первого задания и началом следующего. Если вы хотите избежать перекрытия, лучше всего использовать фиксированную задержку.
поместить их в очередь
Даже если время превышает 20 секунд, текущее задание должно быть завершено, а следующее должно быть выбрано из очереди.
Или вы также можете увеличить время до некоторой разумной суммы.
Я не уверен, что вам нужна синхронизация, так как вторая задача будет заблокирована до завершения первой, и вы получите отставание. Вы можете поместить задания в очередь, но из вашего описания кажется, что очередь может расти бесконечно.
Я бы исследовал ReadWriteLock s и позволил вашей задаче установить блокировку во время ее выполнения. Будущие задачи могут проверить эту блокировку и немедленно выйти, если старая задача все еще выполняется. По опыту я убедился, что это самый надежный способ подойти к этому.
Возможно, вы также создадите предупреждение, чтобы знать, что столкнулись с проблемами, и соответственно увеличить интервал времени?
Вы можете использовать семафор. Когда семафор занят, откажитесь от 2-го задания и дождитесь следующего срабатывания.
Если вы измените свой класс для реализации StatefulJob вместо Job, Quartz позаботится об этом за вас. Из документации javadoc StatefulJob :
задания с отслеживанием состояния не могут выполнять выполнять одновременно, что означает новые триггеры, которые возникают до завершение метода execute (xx) будет отложено.
StatefulJob расширяет Job и не добавляет никаких новых методов, поэтому все, что вам нужно сделать, чтобы получить желаемое поведение, это изменить следующее:
public class YourJob implements org.quartz.Job {
void execute(JobExecutionContext context) {/*implementation omitted*/}
}
На это:
public class YourJob implements org.quartz.StatefulJob {
void execute(JobExecutionContext context) {/*implementation omitted*/}
}
В версии 2.0 Quartz, StatefulJob
устарел. Теперь вместо этого рекомендуется использовать аннотации, например
@DisallowConcurrentExecution
public class YourJob implements org.quartz.Job {
void execute(JobExecutionContext context) {/*implementation omitted*/}
}