2016-01-28 4 views
2

Я новичок Java искал способ сделать следующее:Сделайте что-нибудь, если требуется больше времени, чем х секунд продолжается со следующей задачей

  1. Чтение из файла CSV (CSVReader) одной линии в то время, ,
  2. Проделайте некоторый процесс с данными предыдущего шага.
  3. Если требуется более 30 секунд, пропустите процесс и перейдите к следующей строке.

У меня возникла проблема с шагом 3. Нужно ли устанавливать таймер для этого? Нужно ли мне играть с моей попыткой и поймать? Что вы предлагаете?

Это краткий мой код:

public static void main(String[] args) throws IOException, InterruptedException{ 

    CsvReader data = new CsvReader("data.csv"); 
    data.readHeaders(); 

    int index = 1; 
    int index_max = 50; 
    int retry = 0; 
    int retry_max = 2; 

    while (index < index_max) 
    {   
     if (retry == 0) 
     { data.readRecord(); 

      String Column1 = data.get("COLUMN1"); 
      String Column2 = data.get("COLUMN3"); 
      String Column3 = data.get("COLUMN4"); 
      ... 
     } 
     else 
     { 
      //Retry with the same data 
     }   

     try { 
      //Invoke webservice to send the data and write on DB after validation 

       if (positive.answer == 0) 
       { 
        System.out.println("Great!!!"); 
        index++; 
        retry = 0; 
       } 
       else 
       { 
        System.out.println("Bummer"); 
        index++; 
        retry = 0; 
       } 
      }      
     catch (Exception e) { 
      if (e instanceof webservice_Exception){ 
       //The Exception is about the webservice, print it 
       index++; 
       retry = 0; 
      } else { 
       //The Exception is about another thing, could be a transmission issue, please retry 
       retry++; 
       if (retry == retry_max) 
       { 
       retry = 0; 
       index++; 
       }     
      } 
     } 
    } 
    data.close(); 
} 
+1

Посмотрите здесь: http://stackoverflow.com/questions/2275443/how-to-timeout-a-thread –

+0

Возможный дубликат [Как остановить выполнение через определенное время в Java?] (http://stackoverflow.com/questions/4252187/how-to-stop-execution-after-a-certain-time-in-java) –

+0

Я предполагаю, что это CSV, а не CVS, правильно? – fge

ответ

0

В вашем случае я думаю, что нет никакого другого способа, то делать таймер. Это могло бы быть сделано намного эффективнее, чем я сделал это, но я бы сделал третий пункт, как это (могут быть небольшие ошибки в синтаксисе, так как я написал это очень быстро, но вы, вероятно, получите точку: D):

boolean restart = false; 

private long sTime = 0; 
private long stTime = 0; 
private boolean rng = false; 


Thread t = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     start(); 
     while (true) 
      if (getElapsedTimeSecs() > 30) { 
       skipEntry();// method that skips to next entry 
       stop(); 
       Thread.currentThread().interrupt();//kills the thread 
       return; 
      } 
    } 
}); 

//starts counting time and sets it to running 
public void start() { 
    this.sTime = System.currentTimeMillis(); 
    this.rng = true; 
} 

//sets counter it to not running 
public void stop() { 
    this.stTime = System.currentTimeMillis(); 
    this.rng = false; 
} 

//returns elaspsed time in seconds 
public long getElapsedTimeSecs() { 
    long elapsed; 
    if (rng) { 
     elapsed = ((System.currentTimeMillis() - sTime)/1000); 
    } else { 
     elapsed = ((stTime - sTime)/1000); 
    } 
    return elapsed; 
} 

Вы должны запускать поток каждый раз, когда обрабатываете новую строку.

В этом случае вам понадобится 2 потока вместо одного ... процесс проверки времени может быть выполнен в вашей ветке! В этом случае было бы намного проще реализовать его, и это было бы намного более эффективно! Но без кода, я не могу сделать это лучше :)

Надеюсь, это поможет.

С уважением, Матей

+0

Спасибо за ваш ответ. Сейчас я опубликовал сводку моего кода. Итак, я должен использовать многопоточность ... Мне нужно будет изучить это, я довольно новичок в Java. Я не понял, если в примере, который вы отправили, уже используется 2 потока, или это один поток, а мой код - другой поток? – Rodrick

+0

Когда вы создаете и запускаете новый поток, он запускается одновременно с кодом, который после метода запуска. –

1

Есть инструменты, которые помогут вам сделать то, что вы хотите.

Тот, который приходит на ум, это Guava с его API TimeLimiter.

Вот как его использовать:

TimeLimiter timeLimiter = new SimpleTimeLimiter(); 

MyData data = ... ; 

// With Java 8 
MyResult result = timeLimiter.callWithTimeout(() -> processData(data), 30, TimeUnit.SECONDS, true); 

// Without Java 8 
MyResult result = timeLimiter.callWithTimeout(new Callable<MyResult>() { 
    @Override public MyResult call() { 
    return processData(data); 
    } 
}, 30, TimeUnit.SECONDS, true); 

private MyResult processData(MyData data) { 
    ... 
    return new MyResult(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^