我正在使用 schedule 方法在 TimerTask 中运行一个 java 应用程序,即它以特定的时间间隔运行,如果 timertask 延迟,它不会尝试追赶。如果不是无限期地,我希望程序尽可能长时间地运行。我正在使用 Netbeans 7.3。
但是,我发现几个小时后(有时只有 1 小时,有时超过 24 小时),程序停止打印到控制台,实际上完全停止运行。我知道它不仅仅是停止打印到控制台,因为该程序还会定期发送电子邮件,并且在它停止后电子邮件也停止发送。它并不总是说“构建完成”或抛出异常,尽管有时它会简单地说“构建完成”并停止运行。
我试过在网上四处寻找,但似乎找不到任何确凿的答案。我在某处看到如果 TimerTask 抛出未经检查的异常,它将停止运行,但由于它并不总是在 TimerTask 结束时停止,而是在任务中间的某个随机点停止,我认为这不是什么正在发生。
有谁知道出了什么问题以及我该如何解决?
任何指针将不胜感激。
谢谢,保罗
编辑:在我尝试将记录器放入我的 timertask 后,代码出错并出现以下异常:java.io.IOException:无法获得 Logging.txt 的锁定。这很可能是一个单独的问题,因为我从未使用过记录器。我在某处读到此异常可能意味着我缺少一些在 java 中写入文件的权限(不确定是否是这种情况或如何在 Netbeans 中修复)。如果我修复记录器并且它不相关,我将删除此编辑
编辑:我忘了提到广播功能涉及与各种服务器的大量通信。我认为问题可能是程序只是卡在一条线上并且永远不会完成。在这种情况下,我需要想办法让广播方法在一定时间后超时,然后再试一次。
编辑:这是我的代码示例:
public void RUN(){
exchanges.add(Bitstamp);
exchanges.add(BTCE);
exchanges.add(CampBX);
t.schedule(
new TimerTask()
{
public void run()
{
Broadcast(exchanges);
UseLogger.Log();
}
}, 0,15000);
}
public static void Broadcast(ArrayList<Exchange> exchanges){
for (int i=0; i<exchanges.size();i++){
exchanges.get(i).prepareGetUpdate();
}
System.out.println("************** TICKERS *****************");
try{
for (int i=0; i<exchanges.size();i++){
System.out.println(exchanges.get(i).getPrices());
}
tickerException=false;
} catch (Exception e){
tickerException=true;
}
System.out.println("");
System.out.println("************** BALANCES *****************");
try{
for (int i=0;i<exchanges.size();i++){
System.out.println("i: " + i);
System.out.println(exchanges.get(i).getBalance());
}
balanceException=false;
} catch (Exception e){
balanceException=true;
}
System.out.println("************ ORDERS *****************");
try{
for (int i=0; i< exchanges.size();i++){
exchanges.get(i).getOrders();
if (exchanges.get(i).exchangeName.contentEquals("BTCE")){
exchanges.get(i).Total_btc+=exchanges.get(i).btcInOrders;
exchanges.get(i).Total_usd+=exchanges.get(i).usdInOrders;
}
}
orderException=false;
} catch (Exception e){
orderException = true;
}
for (int i=0; i< exchanges.size();i++){
exchanges.get(i).getUpdate();
}
btcDiff = totalBTC-originalTotal;
btcNeutral=true;
}