java - java中可以有多个调度线程池吗?

标签 java multithreading rest scheduled-tasks threadpool

所以基本上我对多线程非常陌生。 我想以不同的时间间隔安排 5 项任务。 所以我发现了提供调度的执行器服务。

以不同的时间间隔启动五个任务。我不确定是否可以做到。

并且一个或多个任务可能会同时启动。 所以我考虑为所有任务创建多个线程池。他们还会相撞吗? 如果我启动多个线程池,我可能会遇到什么性能问题,也请对此进行指导..!

所以请帮忙!

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

}

最佳答案

原则上使用一个ScheduledExecutorService是没有问题的。此外,在同一时间点开始的任务应该不是问题。

根据任务的数量以及它们的资源密集程度,您可能最终会耗尽线程(或 CPU 或 IO ..),此时任务可能会延迟。但您无法通过创建新的 ScheduledExecutorService 来解决这个问题。

只有当您想要将任务彼此隔离时,创建多个此类服务才有意义。例如,您有一个非常重要的任务,因此您为此任务创建了一个线程池大小为 1 的服务。如果您现在注意您的应用程序(包括用于所有其他任务的 ScheduledExecutorService),则该任务应该始终能够在计划时间执行。请注意,实际上线程的整体利用率会因此而降低,因此整体的时效性和吞吐量会受到影响,因为一个线程基本上是为高优先级任务保留的。

关于java - java中可以有多个调度线程池吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36442910/

相关文章:

java - Java中的多线程通信

Java何时启动新线程?

json - spring mvc 3 内容类型 "application/json"可从客户端运行,但不能从单元测试运行

java - 不知道我在设置 Spring Boot REST 应用程序时做错了什么

rest - Angular2 Http/Jsonp 不发出请求

流并行中的 Java 8 流

java - 在 Java 中解析一个字符串到日期

java - 使用 "id"而不是 "android:id"会导致 NullPointerException

java - 如何在java中通过两个循环访问外部变量

java - 如果非空则使用值,否则等待并原子地获取它,在循环中重复