2016-04-06 10 views
0

Also im Grunde bin ich sehr neu im Multithreading. Ich möchte 5 Aufgaben in verschiedenen Intervallen planen. So erfuhr ich über die Executer-Dienste, die Planung bieten.Können wir mehrere geplante Thread-Pools in Java haben?

Starten von fünf Aufgaben in unterschiedlichen Intervallen. Ich bin mir nicht sicher, kann getan werden.

Und möglicherweise ist es möglich, dass eine oder mehrere Aufgaben gleichzeitig gestartet werden. Also dachte ich über das Erstellen mehrerer Thread-Pools für alle Aufgaben. Werden sie noch kollidieren? und welches Leistungsproblem könnte ich haben, wenn ich mehrere Thread-Pools beginne Bitte leite dies auch ..!

Also bitte helfen!

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

Diese Frage sollte hilfreich sein http://stackoverflow.com/questions/20387881/how-to-run-certain-task-every-day-at-a-particular-time-using-scheduledexecutorse – praveen

+0

Tushar versuchen, die aktualisieren Frage mit Code, den Sie auch versucht haben .. – praveen

+0

k..geben Sie mir eine Minute..der Code ist nicht vollständig, aber sollte ausreichen, um die Situation zu verstehen.! –

Antwort

0

Sie können ScheduledThreadPoolExecutor verwenden

Ein ExecutorService, die Befehle terminieren können nach einer bestimmten Verzögerung laufen, oder periodisch auszuführen.

ScheduledExecutorService

+0

Hatte zuvor vorgeschlagen, einen Timer & TimerTask zu verwenden, aber dann festgestellt, dass der ScheduledThredPoolExecutor mehrere Vorteile gegenüber dem vorherigen http://stackoverflow.com/questions/409932/java-timer-vs-executorservice?lq=1 – praveen

+0

ich bin Ich benutze nur das, was ich frage, ist, dass ich mehrere Instanzen des gleichen erstellen kann und hoffe, dass keiner von ihnen kollidiert und wenn sie tun, was passieren wird ..? –

+0

Es sollte kein Problem sein, dass die Aufgaben nicht kollidieren. – praveen

1

Es gibt kein Problem im Prinzip mit einem ScheduledExecutorService verwenden. Auch Aufgaben, die zum selben Zeitpunkt beginnen, sollten kein Problem darstellen.

Abhängig von der Anzahl der Aufgaben und wie ressourcenintensiv sie sind, können Sie am Ende keine Threads (oder CPU oder IO ..), zu welchem ​​Zeitpunkt Aufgaben möglicherweise verzögert werden. Aber Sie können das nicht beheben, indem Sie einen neuen ScheduledExecutorService erstellen.

Das Erstellen mehrerer solcher Dienste ist nur sinnvoll, wenn Sie Aufgaben voneinander isolieren möchten. Zum Beispiel haben Sie eine Aufgabe, die wirklich wichtig ist, also erstellen Sie einen Service mit einer Thread-Pool-Größe von 1 für diese Aufgabe. Wenn Sie jetzt darauf achten, dass Ihre Anwendung (einschließlich eines ScheduledExecutorService für alle anderen Tasks) immer zum geplanten Zeitpunkt ausgeführt werden kann. Bitte beachten Sie, dass die Gesamtnutzung von Threads dadurch abnimmt, so dass die gesamte Aktualität und der Durchsatz beeinträchtigt werden, da ein Thread grundsätzlich für die Aufgabe mit hoher Priorität reserviert ist.

+0

Wie wäre es mit fünf ScheduledExecutorService? –

+0

@tushargarg Ich habe meine Antwort aktualisiert, um den einzigen Grund zu erklären, warum ich mir mehr als einen Service ausdenken kann. –

+0

Also im Grunde, wenn ich mehr als einen Dienst erstellen. Es könnte sich auf meine TAT auswirken. –

Verwandte Themen