Как перезапустить поток в Java? [дубликат]

Наконец я нашел решение этой проблемы. Вот мой обновленный код

Map<Integer, Object[]> data = new TreeMap<Integer, Object[]>();  
  int i = 1;
    for(Row r1 : sheet) {
      //This is for empty cell value
       String c3;
       if(r1.getCell(column_index_3) == null)
         c3 = " ";
       else
         c3 = r1.getCell(column_index_3).getStringCellValue();
       data.put(i, new Object[]{ r1.getCell(column_index_1).getStringCellValue(), r1.getCell(column_index_2).getStringCellValue(), c3});
        i++;
}
Set<Integer> keyset = data.keySet(); 
            int rownum = 0; 
            for (Integer key : keyset) { 
                // this creates a new row in the sheet 
                Row row1 = sheet1.createRow(rownum++); 
                Object[] objArr = data.get(key); 
                int cellnum = 0; 
                for (Object obj : objArr) { 
                    // this line creates a cell in the next column of that row 
                    Cell cell = row1.createCell(cellnum++); 
                    if (obj instanceof String) 
                        cell.setCellValue((String)obj); 
                    else if (obj instanceof Integer) 
                        cell.setCellValue((Integer)obj);

                } 
            } 
try { 
            // this Writes the workbook gfgcontribute 
            FileOutputStream out = new FileOutputStream(new File("E:\\Dharshan/test.xlsx")); 
            wb.write(out); 
            out.close(); 
            System.out.println("test.xlsx written successfully on disk."); 
        } 
        catch (Exception e) { 
            e.printStackTrace(); 
        } 
}
7
задан yhw42 7 March 2011 в 13:39
поделиться

7 ответов

Если поток умирает из-за неперехваченного исключения, ответ прост: поймайте исключение в соответствующем месте так, чтобы можно было продолжать идти. Или поймайте исключение в рамках своего searchfile метода или сделайте вызов метода выполнения searchfile в цикле.

14
ответ дан 6 December 2019 в 10:03
поделиться

Если Вы хотите, чтобы Ваш поток продолжал бежать, используют цикл.

public void run() {
   while(!Thread.interrupted())
      try {
           searchfile();
      }
      catch(Exception e) {
          e.printStackTrace();
      }
}
2
ответ дан 6 December 2019 в 10:03
поделиться

В Вашей выгоде можно переместиться, файл к ошибочной папке затем создают новый объект того же потока и запускают его снова.

1
ответ дан 6 December 2019 в 10:03
поделиться

если я не понял Вас превратно, Ваш код пропускает "продолжать управлять" природу, т.е. у Вас должен быть цикл где-нибудь:

public static void main(String[] args){

    ExecutorService service = Executors.newFixedThreadPool(4);

    // for each of your 4 folders
    while (true) {
        Future<File> searchResult = service.submit(new SearchTask());
        try {
          File foundFile = searchResult.get();
          // handle found file
        } catch (Exception e) {
          //    handle exception
        }
    }
}

private static class SearchTask implements Callable<File> {

    @Override
    public File call() {
      return searchFile();
    }

    public File searchFile() {
      // search & return found file
    }

}

обратите внимание, что это - просто очень простое расширение Вашего примера. это все еще пропускает параметризацию SearchTask, чтобы на самом деле быть специфичным для папки, обработки файлов и исключений, и т.д., как упомянуто в предыдущих ответах, Ваш SearchTask должен реализовать Выполнимый (я предпочитаю Вызываемый...), и по моему скромному мнению всегда лучше использовать ExecutorService, чем породить потоки вручную.надеюсь, это поможет...

1
ответ дан 6 December 2019 в 10:03
поделиться

Вы сказали, что исключение может быть выдано во время процесса файла, таким образом, я поместил processFile() в блоке try-catch. но если это может быть брошено во время поиска, можно поместить его в выгоду попытки также.

public void run() {
    while(!terminated) {    
        findNextFile();
        try {
            processFile();
        } catch {
            // handle error
        }
    }
}
0
ответ дан 6 December 2019 в 10:03
поделиться

Вот мои предположения на основе Вашего вопроса и Вашего разъяснения:

  • Каждый поток, в run() метод, только вызовы searchfile() однажды а не в цикле
  • Ваш searchfile() метод имеет цикл в нем, и Вы хотите, чтобы тот цикл продолжил работать, даже если исключение выдается в нем.
  • у Вас есть некоторый способ инициализировать каждый поток, который Вы не показываете нам (и который не ужасно важен для этого определенного quiestion),
  • searchfile() не объявляет, что это бросает любого Exception
  • Вы не используете платформу журналирования, но вместо этого используете System.out (хотя использование платформы журналирования является Действительно Хорошей Идеей
  • Java 5 в порядке (иначе, необходимо будет использовать другое for() цикл ниже

С этими предположениями Вы не хотите планировать поймать Exception в Вашем run() метод за исключением цели зарегистрировать это что-то пошло очень неправильно:

public void run() {
    try {
        searchfile();
    } catch (RuntimeException e) {
        System.out.println("Something went very wrong!  Unexpected RuntimeException");
        e.printStackTrace();
    }
}

Обратите внимание, что код ловит RuntimeException. Всегда ловите самое определенное Exception это сделает то, в чем Вы нуждаетесь. Затем то, в чем Вы нуждаетесь, является чем-то, таким как следующее в Вашем searchfile() метод:

File[] files = directory.listFiles();
for (File file : files) {
    try {
        // Do your normal file/directory processing here
    } catch (Exception e) {
        System.out.println("Exception processing file " + file.getName() + " " + e);
        // Move "file" to another area
    }
}

Так как Вы захватываете неожиданный Exceptions в основном цикле Вашего Thread, Ваш поток продолжит обрабатывать после обработки Exception.

0
ответ дан 6 December 2019 в 10:03
поделиться

Я не совсем уверен, сработает ли это, но вот попытка.

public void run() {
    try {
        searchFile();
    } catch(Exeption e) {
        e.printStackTrace();
        if(!Thread.currentThread().isAlive())
            Thread.currentThread().start();
    }
}
1
ответ дан 6 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: