Работаю над проектом, в котором возникают проблемы с потоками. Существует проблема, которая заставляет поток завершаться, и ничто не может перезапустить поток, поэтому мы хотели бы изменить эту текущую реализацию. мы придумали запустить поток наблюдателей для управления потоком обработки файлов.
Может кто-нибудь предложить, как сделать поток, который следит за состоянием программы и идеями о том, как это сделать, пожалуйста.Как использовать наблюдателя потоков
Редактировать: Так что в основном это то, что происходит. Пользователь загружает некоторые мультимедийные файлы, которые записываются в файл-файл. поток, выполняющийся в мобильных службах, сканирует медиафайл и прикрепляется к электронной почте. В этом процессе поток завершается, и он не может подключить носитель к электронной почте.
Ниже приведен код моего сервлета и метод запуска.
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.");
}
'Существует процесс, который делает нить terminate' IMHO вы должны исправить эту причину, а не пытаться работы- вокруг. Вы не собираетесь делать это лучше с большим количеством потоков. –
, проясните «процесс» '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' или '' перепишите свой вопрос. Не знаете, как процесс (другой процесс?) Может остановить (как?) Поток JVM –
@ user1445898: см. Мое редактирование выше. – user2821894