所以基本上我對多線程很陌生。 我想以不同的時間間隔安排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");
}
}
這個問題應該是有幫助的http://stackoverflow.com/questions/20387881/how-to-run-certain-task-every-day-at-a-particular-time-using-scheduledexecutorse – praveen
tushar嘗試更新問題與代碼,你已經嘗試.. – praveen
k ..給我一分鐘..代碼不完整,但應該足以瞭解情況。 –