Saya memerlukan beberapa jenis layanan yang akan menjalankan beberapa tugas secara bersamaan dan dalam interval 1 detik selama 1 menit.
Jika salah satu tugas gagal, saya ingin menghentikan layanan dan setiap tugas yang berjalan dengannya dengan semacam indikator bahwa ada sesuatu yang salah, jika tidak, setelah satu menit semuanya berjalan dengan baik, layanan akan berhenti dengan indikator bahwa semua berjalan dengan baik.
Sebagai contoh, saya memiliki 2 fungsi:
Runnable task1 = ()->{
int num = Math.rand(1,100);
if (num < 5){
throw new Exception("something went wrong with this task,terminate");
}
}
Runnable task2 = ()->{
int num = Math.rand(1,100)
return num < 50;
}
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
task1schedule = scheduledExecutorService.scheduleAtFixedRate(task1, 1, 60, TimeUnit.SECONDS);
task2schedule = scheduledExecutorService.scheduleAtFixedRate(task2, 1, 60, TimeUnit.SECONDS);
if (!task1schedule || !task2schedule) scheduledExecutorService.shutdown();
Ada ide tentang bagaimana saya harus mengatasi ini dan membuat hal-hal yang sama generik mungkin?
java
multithreading
java-8
concurrency
runnable
totothegreat
sumber
sumber
Math.rand
bukan API bawaan. Suatu implementasiRunnable
harus memilikivoid run
definisi. Jenistask1/2schedule
akan beradaScheduledFuture<?>
dalam konteks yang disediakan. Pindah ke pertanyaan aktual, bagaimana cara memanfaatkannyaawaitTermination
? Anda bisa melakukannya sebagaischeduledExecutorService.awaitTermination(1,TimeUnit.MINUTES);
. Atau, bagaimana dengan memeriksa jika salah satu tugas harus dibatalkan sebelum selesai normal:if (task1schedule.isCancelled() || task2schedule.isCancelled()) scheduledExecutorService.shutdown();
?Jawaban:
Idenya adalah bahwa tugas tersebut mendorong ke objek Common TaskCompleteEvent. Jika mereka mendorong kesalahan, penjadwal dihentikan dan semua tugas akan berhenti.
Anda dapat memeriksa hasil dari setiap tugas-iterasi di peta "kesalahan" dan "sukses".
sumber
Anda hanya perlu menambahkan tugas tambahan yang tugasnya adalah memantau semua tugas yang sedang berjalan lainnya - dan ketika salah satu tugas yang dipantau gagal, mereka perlu mengatur semaphore (bendera) yang dapat diperiksa oleh pembunuh bayaran.
sumber
TimerTask
sama sekali tidak terkait denganScheduledExecutorService
; itu hanya terjadi pada implementasiRunnable
. Selanjutnya, tidak masuk akal untuk menjadwalkan tugas berkala, hanya untuk memeriksa apakah waktu tertentu (ConfigurationOptions.getPollingCycleTime()
) telah tercapai. Anda punyaScheduledExecutorService
, jadi Anda bisa mengatakannya untuk menjadwalkan tugas yang tepat untuk waktu yang diinginkan.TimerTask
denganRunnable
dan Anda telah memperbaiki masalahnya, tanpa mengubah apa yang dilakukan kode. Selanjutnya, cukup gunakanexecutor.schedule(assassin, ConfigurationOptions.getPollingCycleTime(), ChronoUnit.MINUTES);
dan itu akan berjalan sekali pada waktu yang diinginkan, karenanya,if(LocalDateTime.now().isAfter(death))
cek tersebut sudah usang. Sekali lagi, tidak mengubah apa yang dilakukan kode, selain melakukannya secara substansial lebih sederhana dan lebih efisien.