2016-04-06 26 views
0

所以基本上我對多線程很陌生。 我想以不同的時間間隔安排5個任務。 所以我發現了提供調度的執行者服務。我們可以在java中有多個預定的線程池嗎?

以不同的時間間隔啓動五個任務。我不確定可以做到。

可能有一個或多個任務可能同時啓動。 所以我想爲所有任務創建多個線程池。他們還會碰撞嗎? 和我可能面臨的性能問題,如果我啓動多個線程池請指導這一點..!

所以請大家幫忙!

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

}

+0

這個問題應該是有幫助的http://stackoverflow.com/questions/20387881/how-to-run-certain-task-every-day-at-a-particular-time-using-scheduledexecutorse – praveen

+0

tushar嘗試更新問題與代碼,你已經嘗試.. – praveen

+0

k ..給我一分鐘..代碼不完整,但應該足以瞭解情況。 –

回答

0

可以使用的ScheduledThreadPoolExecutor

一個ExecutorService,可安排的命令給定延遲後運行命令,或者定期地執行。

ScheduledExecutorService

+0

以前建議使用Timer&TimerTask,但後來發現ScheduledThredPoolExecutor比以前的幾個優點http://stackoverflow.com/questions/409932/java-timer-vs-executorservice?lq=1 – praveen

+0

我是使用相同的唯一我所問的是,我可以創建多個相同的實例,並希望他們沒有碰撞,如果他們做會發生什麼..? –

+0

它不應該是任務不會碰撞的問題。 – praveen

1

有原則上使用一個ScheduledExecutorService的沒有問題。在相同時間點開始的任務也不應該成爲問題。

根據任務的數量以及資源密集程度,它們最終可能會耗盡線程(或CPU或IO ..),此時任務可能會延遲。但是你將無法通過創建一個新的ScheduledExecutorService來解決這個問題。

創建多個此類服務只有在您想要將任務彼此隔離時纔有意義。例如,您有一個非常重要的任務,因此您爲此任務創建線程池大小爲1的服務。如果您現在注意您的應用程序(包括所有其他任務的ScheduledExecutorService),該任務應始終能夠在預定時間執行。請注意,實際上,線程的整體利用率降低了,所以整體時效性和吞吐量將受到打擊,因爲一個線程基本上是爲高優先級任務保留的。

+0

五個ScheduledExecutorService怎麼樣? –

+0

@tushargarg我更新了我的答案,以澄清我能想出創造更多服務的唯一原因。 –

+0

所以基本上如果我創建多個服務。它可能會影響我的TAT。 –

相關問題