1

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");
}

}

tushar garg
  • 69
  • 1
  • 6

2 Answers2

1

There is no problem in principle with using one ScheduledExecutorService. Also tasks starting at the same point in time shouldn't be a problem.

Depending on the number of tasks, and how resource intensive they are you might end up running out of threads (or CPU or IO ..), at which point tasks might get delayed. But you won't be able to fix that by creating a new ScheduledExecutorService.

Creating multiple such services makes only sense if you want isolate Tasks from each other. For example you have one Task which is really important, so you create a service with a thread pool size of 1 for this task. If you now take care that your application (including a ScheduledExecutorService for all other tasks), that Task should always be able to execute at the scheduled time. Please note that actually the overall utilization of threads decreases by this, so the overall timeliness and throughput will take a hit, because one thread is basically reserved for the high priority task.

Jens Schauder
  • 77,657
  • 34
  • 181
  • 348
0

You can use ScheduledThreadPoolExecutor

An ExecutorService that can schedule commands to run after a given delay, or to execute periodically.

ScheduledExecutorService

Praveen Kumar
  • 1,515
  • 1
  • 21
  • 39