So basically i'm very new to multithreading. i want to schedule 5 tasks at different intervals. So i found out about the executer services which provide scheduling.
Starting five tasks at different interval. i'm not sure can be done.
And it might be possible that one or tasks may start at the same time. So i thought about creating multiple thread pools for all tasks. will they still collide? and what performance issue i might face if i start multiple thread pools Please guide on this too..!
So please help!
public class NewScheduler {
public static final Logger logger = Logger.getLogger(NewScheduler.class.getName());
static ScheduledExecutorService scheduledExecutorService;
List<ExecuterSchedulerBean> list = new ArrayList<>();
FanMonitorDao fanMonitorDao;
public static void proceed(){
logger.info("NewScheduler || proceed || :-START");
List<Runnable> runnableList = new ArrayList<>();
NewScheduler scheduler = new NewScheduler();
runnableList.add(new ActiveLinkChecker());
runnableList.add(new SecondScheduler());
runnableList.add(new ThirdScheduler());
runnableList.add(new FourthScheduler());
runnableList.add(new FifthScheduler());
for(Runnable check : runnableList){
try {
scheduledExecutorService = Executors.newScheduledThreadPool(1);
if(check instanceof ActiveLinkChecker){
scheduler.schedulerTasks("linkChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("linkChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof SecondScheduler){
scheduler.schedulerTasks("secondChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("secondChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof ThirdScheduler){
scheduler.schedulerTasks("thirdChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("thirdChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof FourthScheduler){
scheduler.schedulerTasks("fourthChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("fourthChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof FifthScheduler){
scheduler.schedulerTasks("fifthChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("fifthChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}
} catch (SocketException e) {
logger.info("Error in SchedularTaskServlet in Scheduling batches :-" + e);
try {
scheduledExecutorService = Executors.newScheduledThreadPool(1);
if(check instanceof ActiveLinkChecker){
scheduler.schedulerTasks("linkChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("linkChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof SecondScheduler){
scheduler.schedulerTasks("secondChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("secondChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof ThirdScheduler){
scheduler.schedulerTasks("thirdChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("thirdChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof FourthScheduler){
scheduler.schedulerTasks("fourthChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("fourthChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof FifthScheduler){
scheduler.schedulerTasks("fifthChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("fifthChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}
} catch (Exception ex) {
logger.info("Error in SchedularTaskServlet in Scheduling batches :-" + ex, new Throwable());
e.printStackTrace();
}
e.printStackTrace();
} catch (SQLException e) {
logger.info("Error in SchedularTaskServlet in Scheduling batches :-" + e);
try {
scheduledExecutorService = Executors.newScheduledThreadPool(1);
if(check instanceof ActiveLinkChecker){
scheduler.schedulerTasks("linkChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("linkChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof SecondScheduler){
scheduler.schedulerTasks("secondChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("secondChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof ThirdScheduler){
scheduler.schedulerTasks("thirdChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("thirdChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof FourthScheduler){
scheduler.schedulerTasks("fourthChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("fourthChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}else if(check instanceof FifthScheduler){
scheduler.schedulerTasks("fifthChecker", check);
ExecuterSchedulerBean bean = new ExecuterSchedulerBean();
bean.setServiceName("fifthChecker");
bean.setScheduledExecutorService(scheduledExecutorService);
}
} catch (Exception ex) {
logger.info("Error in SchedularTaskServlet in Scheduling batches :-" + ex, new Throwable());
e.printStackTrace();
}
e.printStackTrace();
} catch (Exception e) {
logger.info("Error in SchedularTaskServlet in Scheduling batches :-" + e, new Throwable());
e.printStackTrace();
}
}
logger.info("NewScheduler || proceed || :-END");
}
private void schedulerTasks(String taskName, Runnable scheduler) throws SQLException, SocketException {
logger.debug("NewScheduler || schedulerTasks || :-START");
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy kk:mm");
Calendar cal = null;
int weekDay = 0, weekMin = 0, weekHr = 0, runDay = 0, runHr = 0, runMin = 0, runDelay = 0;
float runGap = 0;
String flag = null;
fanMonitorDao = new FanMonitorDaoImpl();
try {
SchedulerBean bean = fanMonitorDao.getScheduler(taskName);
flag = (("A").equalsIgnoreCase(bean.getSchedulerStatus())?"Y":"N").trim();
if (flag != null && flag.equalsIgnoreCase("Y")) {
cal = Calendar.getInstance();
weekDay = cal.get(Calendar.DAY_OF_WEEK);// get the Weekday , from 1 to 7
weekHr = cal.get(Calendar.HOUR_OF_DAY);// get the Weekday , from 0 to 23
weekMin = cal.get(Calendar.MINUTE);// get the Weekday , from 0 to 59
System.out.println("Current Week Day is :->" + weekDay + ", Week Hrs:->" + weekHr + ", Week Min:->" + weekMin);
runDay = (runDay=Integer.parseInt(bean.getSchedulerDay().trim())) == 0 ? weekDay : runDay;
runHr = (runHr=Integer.parseInt(bean.getSchedulerHrs().trim()))== 0 ? weekHr : runHr;
runMin = Integer.parseInt(bean.getSchedulerMin().trim());
runGap = Float.parseFloat(bean.getSchedulerGap().trim());
runDelay = Integer.parseInt(bean.getSchedulerDelay().trim());
runDay = (runDay >= weekDay) ? (runDay - weekDay) : runDay + (7 - weekDay);
runHr = (runHr >= weekHr) ? (runHr - weekHr) : runHr + (24 - weekHr);
runMin = (runMin >= weekMin) ? (runMin - weekMin) : runMin - weekMin;
System.out.println("Difference between current values and Property values are :-days:->" + runDay + " Hrs:->" + runHr + " Min:->" + runMin);
cal.setTime(sdf.parse(sdf.format(new Date())));
cal.add(Calendar.DATE, runDay);
cal.add(Calendar.HOUR, runHr);
cal.add(Calendar.MINUTE, runMin);
runDay = Integer.parseInt(String.valueOf((cal.getTimeInMillis() - (sdf.parse(sdf.format(new Date()))).getTime())));
System.out.println("Next First run time is :->" + runDay + "-->>" + runDelay * runGap * 60 * 60 * 1000);
@SuppressWarnings("unused")
ScheduledFuture<?> alarmFuture = scheduledExecutorService.scheduleWithFixedDelay(scheduler, (long) runDay, (long) ((long) runDelay * runGap * 60 * 60 * 1000), TimeUnit.MILLISECONDS);
}
} catch (Exception e) {
logger.info("Error in SchedularTaskServlet in Scheduling batches :-" + e, new Throwable());
e.printStackTrace();
}
logger.debug("NewScheduler || schedulerTasks || :-END");
}
}