0

我正在使用 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;
}
4

0 回答 0