Я пытаюсь запустить задачу периода из main() с помощью функций TimerTask на Java и запускать задачу run(). Код после таймера - это REPL. Код выглядит так:TimerTask hangs
public static void main(String[] asArguments){
java.util.Timer timer = new Timer();
long durationDelay_ms = 60*60*1000; // 1 hour
long durationPeriod_ms = 60*60*1000; // 1 hour
timer.scheduleAtFixedRate( // reload prices every hour
new TimerTask() {
@Override
public void run() {
StringBuffer sbError = new StringBuffer();
if(! reload(false, sbError)){
System.out.println("error reloading prices: ");
}
sbError = null; // garbage collect
}
}, durationDelay_ms, durationPeriod_ms);
// REPL
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true){
System.out.print("> ");
try {
String s = br.readLine();
\\ ... code to process command
} catch(Throwable t) {
\\ handle error
}
}
}
public static final boolean reload(){
for(int i = 1; i <= 4; i++){
String sURL = "c:\\xyz.com\\" + i; \\ URL I am reading from
System.out.println("retrieving data from:\n" + sURL);
StringBuffer sb = new StringBuffer(10000);
try {
URL url = new URL(sURL);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
sb = readStream(con.getInputStream());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
System.out.println(sb.toString());
}
Задача пытается сделать несколько URL-соединений и распечатать ответ каждого из них. Что происходит на практике, так это то, что сообщение «получение данных из ...» появляется один раз, тогда задача, похоже, зависает. Если я использую REPL, набрав команду в StdIn, в stdout появятся ошибки «время ожидания соединения».
Итак, TimerTask, похоже, как-то противоречит REPL (который блокирует readline). Что здесь происходит?
Здесь нет проблем с перекрытием задач. Период таймера составляет 1 час, поэтому конфликт задач не возникает. Выполняется первая задача FIRST. –