Java executor.scheduleAtFixedRate增加延迟
我遇到了一些执行人延误的问题。我的线程如下所示:Java executor.scheduleAtFixedRate增加延迟,java,multithreading,Java,Multithreading,我遇到了一些执行人延误的问题。我的线程如下所示: public void run() { logger.log("Starting " + tso.getName() + " for " + dataType); List<String[]> allRows = new ArrayList<String[]>(); String[] lastRow; LocalDateTime lastDate;; LocalDateTime la
public void run() {
logger.log("Starting " + tso.getName() + " for " + dataType);
List<String[]> allRows = new ArrayList<String[]>();
String[] lastRow;
LocalDateTime lastDate;;
LocalDateTime lastQuarterHour;
while (true) {
try {
// Make attempt to take CSV data for today. If there is no data wait several seconds and try again
allRows = getCSVRows();
if (allRows == null || allRows.isEmpty()) {
logger.log("Sleeping thread due to empty list for TSO " + tso.getName() + " and data type " + dataType);
Thread.sleep(MILISECONDS_TO_WAIT);
continue;
}
lastRow = allRows.get(allRows.size() - 1);
lastDate = convertStringToUTC(lastRow[0] + " " + lastRow[2]);
lastQuarterHour = takeLastQuorterHourTime();
// If CSV data is available take the last record if it is before last quarter hour wait SEVERAL seconds and try again
if (lastDate.isBefore(lastQuarterHour)) {
logger.log("Sleeping due to lack of information for the current quarter for TSO " + tso.getName() + " and data type " + dataType);
Thread.sleep(MILISECONDS_TO_WAIT);
} else {
break;
}
} catch (InterruptedException e) {
logger.log(e.getMessage());
}
}
}
}
那么,当线程完成2-3次休眠并终止时,或者当线程本身启动时,延迟什么时候开始,不管它工作多长时间?这可能与您在线程内部休眠有关 Thread.SleepMilications_到_等待 尝试移除这些,看看问题是否仍然存在 [编辑]
您的问题的答案是,它将每X秒运行一次,并从初始线程/下一个线程启动时开始计数,但如果线程在计划执行时由于线程休眠或例如执行非常繁重的计算而不可用,它将等待它变为可用。yes,我确实认为这与此有关,但线程必须睡眠:/我认为您的线程池没有设置为具有足够的线程来支持睡眠,因此,您会看到它在几次迭代后变慢,而不是在开始时变慢@Tenorfly我认为您的线程池没有设置为有足够的线程来支持睡眠,这意味着什么@Jockie当您创建ScheduledExecutorService时,您可以执行如下操作:ScheduledExecutorService executor=Executors.NewsScheduledThreadPool1;其中的值将以某种方式定义池中有多少线程,但不能确切地确定它是如何工作的,如果池中没有足够的线程来启动一个新的线程,它将不得不等待线程可用@Tenorfly@Tenorfly对不起我错了,我去测试了这个,它与执行器中没有足够的线程这一事实无关。正如您在我的答案的编辑中所看到的,它将延迟整个执行,直到线程可用为止,这仅仅是因为调度的执行器只为执行该可运行线程留出了一个线程
executor.scheduleAtFixedRate(extractorThread, 0, WAIT_INTERVAL_MINUTES, TimeUnit.SECONDS);