Bazen tekrarlanan görevin süresi, süresinden daha uzundur (Benim durumumda, bu, saatlerce olabilir) . Çalıştırmak için 7 dakika süren ve her 10 dakikada bir çalışacak şekilde planlanan tekrarlanan bir görev düşünün, ancak her koşuda birkaç saat için bazen 15 dakika sürün.Java'da tek bir iş parçacığının yinelenen yinelenen zamanlamasını programlayın, ancak önceki çalışma bitmemişse, geçerli koşuyu atlayın
Zamanlayıcı ve ScheduledThreadPoolExecutor sınıflarının her ikisi de genellikle bu tür işlevler için kullanılan bir ScheduleAtFixedRate yöntemine sahiptir. Ancak, her ikisi de 'geride kaldıklarında onları yakalamaya çalıştıkları' karakteristiğine sahiptir. Başka bir deyişle, bir Zamanlayıcı birkaç infaz tarafından geride kalırsa, görevlerin hiçbiri daha uzun sürmüyorsa gerçekleşecek olan çalışma sayısına geri dönene kadar sürekli çalışacak bir kuyruk kuyruğu oluşturur. belirtilen süre. Bir önceki çalışma tamamlanmadığında mevcut yürütmeyi atlayarak bu davranıştan kaçınmak istiyorum.
Havuzlanmış bir yürütücünün AfterExecution yöntemiyle uğraşmak, bir gecikmeyi yeniden hesaplamak ve yeni gecikme ile yeniden çalıştırmayı yeniden zamanlamayı içeren bir çözümüm var, ancak daha basit bir yöntem olup olmadığını veya bu işlev zaten varsa bir yerlerde ortak bir kütüphane. Sabit bir süre yerine sabit bir gecikmeyle zamanlamayı bildiğimi biliyorum, ancak bu, işleri sabit zamanlarında yürütmeyi denemenin önemli olduğu için benim için işe yaramayacaktır. AfterExecution çözümümden daha basit seçenekler var mı?
Çalışmakta olan başka bir örnek olup olmadığını kontrol etmenin en kolay yolu, ve eğer öyleyse, hemen kendini çekmektir. –
@Hot Licks: ScheduledExecutorService aslında onları paralel olarak çalıştırmaz. –
Peki burada anahtar gereksinim nedir? Bu sadece ve her zaman bir ** 10 dakika arayla, bir cevapsız olup olmadığına bakılmaksızın başlar? Eğer öyleyse, bir oran hakkında konuşmuyorsunuz. –