বর্তমান জাভা এসই 8 রিলিজের সাথে এটির দুর্দান্ত তারিখের সময় এপিআই সহ java.time
এই জাতীয় গণনা java.util.Calendar
এবং ব্যবহারের পরিবর্তে আরও সহজেই করা যায় java.util.Date
।
আপনার ব্যবহারের ক্ষেত্রে কোনও কাজের সময় নির্ধারণের উদাহরণ হিসাবে এখন:
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
ZonedDateTime nextRun = now.withHour(5).withMinute(0).withSecond(0);
if(now.compareTo(nextRun) > 0)
nextRun = nextRun.plusDays(1);
Duration duration = Duration.between(now, nextRun);
long initalDelay = duration.getSeconds();
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(new MyRunnableTask(),
initalDelay,
TimeUnit.DAYS.toSeconds(1),
TimeUnit.SECONDS);
initalDelay
মধ্যে সঞ্চালনের বিলম্ব নির্ধারণকারী জিজ্ঞাসা করতে নির্ণয় করা হয় TimeUnit.SECONDS
। ইউনিট মিলিসেকেন্ড এবং নীচে সময় পার্থক্য সম্পর্কিত বিষয়গুলি এই ব্যবহারের ক্ষেত্রে তুচ্ছ বলে মনে হচ্ছে। তবে আপনি এখনও মিলিসেকেন্ডে শিডিয়ুলিং গণনাগুলি ব্যবহার করতে duration.toMillis()
এবং TimeUnit.MILLISECONDS
পরিচালনা করতে পারেন ।
এবং এছাড়াও টাইমারটাস্ক এই বা সময়সূচী এক্সেকিউটারসেবার জন্য আরও ভাল?
না: ScheduledExecutorService
আপাতদৃষ্টিতে এর চেয়ে ভাল TimerTask
। স্ট্যাকওভারফ্লো ইতিমধ্যে আপনার জন্য একটি উত্তর আছে ।
@ প্যাডিডি থেকে,
আপনার কাছে এখনও সমস্যা রয়েছে যার দ্বারা আপনার যদি সঠিক স্থানীয় সময়টি চালানো চান তবে আপনাকে বছরে দুবার এটি পুনরায় চালু করতে হবে। সময়সূচিএটিফিক্সডরেট এটি কাটবে না যতক্ষণ না আপনি সারা বছর একই ইউটিসি সময় নিয়ে খুশি হন।
যেহেতু এটি সত্য এবং @ প্যাডিডি ইতিমধ্যে একটি workaround দিয়েছে (তাকে +1), তাই আমি জাভা 8 তারিখের সময় এপিআই সহ একটি কাজের উদাহরণ সরবরাহ করছি ScheduledExecutorService
। ডেমন থ্রেড ব্যবহার করা বিপজ্জনক
class MyTaskExecutor
{
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
MyTask myTask;
volatile boolean isStopIssued;
public MyTaskExecutor(MyTask myTask$)
{
myTask = myTask$;
}
public void startExecutionAt(int targetHour, int targetMin, int targetSec)
{
Runnable taskWrapper = new Runnable(){
@Override
public void run()
{
myTask.execute();
startExecutionAt(targetHour, targetMin, targetSec);
}
};
long delay = computeNextDelay(targetHour, targetMin, targetSec);
executorService.schedule(taskWrapper, delay, TimeUnit.SECONDS);
}
private long computeNextDelay(int targetHour, int targetMin, int targetSec)
{
LocalDateTime localNow = LocalDateTime.now();
ZoneId currentZone = ZoneId.systemDefault();
ZonedDateTime zonedNow = ZonedDateTime.of(localNow, currentZone);
ZonedDateTime zonedNextTarget = zonedNow.withHour(targetHour).withMinute(targetMin).withSecond(targetSec);
if(zonedNow.compareTo(zonedNextTarget) > 0)
zonedNextTarget = zonedNextTarget.plusDays(1);
Duration duration = Duration.between(zonedNow, zonedNextTarget);
return duration.getSeconds();
}
public void stop()
{
executorService.shutdown();
try {
executorService.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException ex) {
Logger.getLogger(MyTaskExecutor.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
বিঃদ্রঃ:
MyTask
ফাংশন সহ একটি ইন্টারফেস execute
।
- থামার সময়
ScheduledExecutorService
, সর্বদা এটির অনুরোধ করার awaitTermination
পরে ব্যবহার shutdown
করুন: আপনার কাজটি আটকে / অচল হয়ে যাওয়ার সম্ভাবনা থাকে এবং ব্যবহারকারী চিরকাল অপেক্ষা করেন wait
পূর্বের উদাহরণটি আমি ক্যালেন্ডারের সাথে দিয়েছিলাম কেবল একটি ধারণা যা আমি উল্লেখ করেছি, আমি সঠিক সময় গণনা এবং দিবালোক সংরক্ষণের বিষয়গুলি এড়িয়ে চলেছি। @ প্যাডিডি-র অভিযোগের ভিত্তিতে সমাধান আপডেট করেছেন