【发布时间】:2016-02-09 15:37:05
【问题描述】:
我正在尝试通过 Java 中的 TimerTask 功能从 main() 启动一个周期任务,而 run() 任务正在挂起。 Timer 之后的代码是 REPL。代码如下所示:
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 连接并打印出每个 URL 的响应。在实践中发生的是“从...检索数据”消息出现一次,然后任务似乎挂起。如果我使用 REPL,通过在 StdIn 输入命令,则 stdout 中会出现“连接超时”错误。
因此,TimerTask 似乎以某种方式与 REPL(在 readline 上阻塞)发生冲突。这是怎么回事?
【问题讨论】:
标签: java multithreading timer