2015-04-28 3 views
0

Работаю над проектом, в котором возникают проблемы с потоками. Существует проблема, которая заставляет поток завершаться, и ничто не может перезапустить поток, поэтому мы хотели бы изменить эту текущую реализацию. мы придумали запустить поток наблюдателей для управления потоком обработки файлов.
Может кто-нибудь предложить, как сделать поток, который следит за состоянием программы и идеями о том, как это сделать, пожалуйста.Как использовать наблюдателя потоков

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

Ниже приведен код моего сервлета и метод запуска.

private synchronized void startProcessing() { 
    boolean processor = false; 
    try { 
     Properties mProp = SystemUtil.filterProperties(SystemImpl.getInstance().getApplicationProperties("Media")); 
     processor = (Boolean.parseBoolean(mProp.getProperty("processor", "false")) && Boolean.parseBoolean(System.getProperty("RunProcessor", "false"))); 
    } catch (Exception e) { 
     logger.log(Level.INFO, "Unable to get 'processor' value from property file. Defaulting to false."); 
    } 
    if (processor) { 
     if (null != thread) { 
      if (thread.getState().equals(State.TERMINATED)) { 
       thread = new Thread(fProc); 
      } 
     } else { 
      thread = new Thread(fProc); 
     } 
     if (thread.getState().equals(State.NEW)) { 
      logger.log(Level.INFO, "processor starting..."); 
      thread = new Thread(fProc); 
      thread.start(); 
      logger.log(Level.INFO, "processor successfully started."); 
     } else { 
      logger.log(Level.INFO, "processor thread is already running."); 
     } 
    } else { 
     logger.log(Level.INFO, "processor configured not to run."); 
    } 
} 

public void run() { 
    int sleepTime = 10000; 
    try { 
     sleepTime = Integer.parseInt(mProp.getProperty("ProcessorSleepTime")); 
     waitTime = -(Integer.parseInt(mProp.getProperty("ProcessorWaitTime"))); 
     keepProcessed = Boolean.parseBoolean(mProp.getProperty("KeepProcessed")); 
    } catch (Exception ex) { 
     logger.log(Level.WARNING, "Unable to read property file. Using default values."); 
    } 
    File filePath = new File(MResource.getMRepositoryPath()); 
    File processingPath = new File(filePath.getPath() + "/" + PROCESS_FOLDER_NAME); 
    if (!processingPath.exists()) { 
     processingPath.mkdirs(); 
    } 
    File failurePath = new File(filePath.getPath() + "/" + FAILURE_FOLDER_NAME); 
    if (!failurePath.exists()) { 
     failurePath.mkdirs(); 
    } 
    File processedPath = new File(filePath.getPath() + "/" + PROCESSED_FOLDER_NAME); 
    if (!processedPath.exists()) { 
     processedPath.mkdirs(); 
    } 
    while (!stopProcessing) { 
     isProcessing = true; 
     logger.log(Level.FINEST, "Checking for files..."); 
     try { 
      processFiles(filePath, processingPath, failurePath, processedPath); 
      try { 
       Thread.sleep(sleepTime); 
      } catch (InterruptedException e) { 
       logger.log(Level.INFO, "Thread sleep interrupted."); 
      } 
     } catch (Exception e) { 
      logger.log(Level.SEVERE, "Error while processing files.", e); 
     } 
    } 
    isProcessing = false; 
    stopProcessing = false; 
    logger.log(Level.WARNING, " file processor has stopped."); 
} 
+0

'Существует процесс, который делает нить terminate' IMHO вы должны исправить эту причину, а не пытаться работы- вокруг. Вы не собираетесь делать это лучше с большим количеством потоков. –

+0

, проясните «процесс» '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' или '' перепишите свой вопрос. Не знаете, как процесс (другой процесс?) Может остановить (как?) Поток JVM –

+0

@ user1445898: см. Мое редактирование выше. – user2821894

ответ

0

Вы наверняка не должны заканчивать нить. Возможно, вы должны заставить поток ждать. Чтобы перезапустить поток, вам нужно знать, что это точное состояние, когда оно завершено. Вам нужно будет сохранить состояние этого потока, а затем полностью восстановить правильную нить. Итак, вы первый вопрос, вероятно, «Как мне это сделать». Не зная свою программу внутри и снаружи, невозможно сказать вам. Но это должно быть абсолютным последним средством. Поскольку это чрезвычайно страшная идея почти в каждом случае (ожидайте больше ошибок, чем вы можете использовать)

TLDR;

Плохая идея. Не завершайте нить.

Редактировать: Ну, я думаю, вам нужно найти ошибку, которая сначала убивает поток. Если вы не найдете этого, вы не сможете сохранить состояние потока, прежде чем он все равно умрет. Вы можете попробовать использовать операторы печати или отладчик

+0

Спасибо за ответ. Я чувствую себя расслабленным, глядя на ответ. И да, мы действительно не хотим прекращать нить, как-то это происходит. И да, у меня, наверное, есть вопрос: «Как мне это сделать». Любые api, любые рамки. Я был googling и нашел этот java doc http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html – user2821894

+0

благодарит за все полезные предложения. Я отредактировал свой вопрос с кодом, который у меня есть сейчас, пожалуйста, предложите на основе кода. – user2821894

+0

Неужели попытка try-catch не исправить вашу проблему? Вы знаете, где находится код? – GDub

1

Я думаю, что будет легче исправить причину, чем перезапустить ее. Существует только два способа прекратить резьбу:

  1. , вызывающий thread.stop(). Это устарело и 99,9% не ваш случай
  2. Выход из метода run() через обычное завершение или исключение. оберните свой метод запуска с помощью try {...} catch (Throwable) finally {} и поместите туда несколько журналов, и вы узнаете причину.

Если вам действительно нужен наблюдатель, вы можете сделать что-то подобное:

void run() { 
    while (true) { 
     thread.join(); 
     thread = new Thread(myRunnable); 
     thread.start(); 
    } 
}