Если нить не нужно делать каких-либо очистки по окончании, а затем просто сделать нить демон нить:
thread.setDaemon(true)
Marks этот поток или как демон нить или нить пользователя , Виртуальная машина Java выходит, когда единственными потоками, запущенными, являются все потоки демона. Этот метод должен быть вызван до начала потока.
Использование setDaemon()
является самым простым, что нужно сделать, и это то, что рекомендуется если ваша обработка нити не нужно делать какие-либо очистки (например, не нужно заполнять или откат атомную совершить сделку) до выхода приложения.
Если вам необходимо выполнить очистку для потока перед выходом, то лучше не делать нить демон, но вместо того, чтобы сделать нить прерываемые, выдавать прерывания и обрабатывать прерывания.
Например, управлять нить с помощью ExecutorService
, что вы выключение в методе Application stop()
с использованием метода, аналогичной описанной в ExecutorService Javadoc:
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
Обратите внимание, что shutdownNow() вызов неявно посылает прерываний ваш поток, который не будет эффективен, если ваш процессор потока явно не закодирован для обработки прерывания.
Типичные реализации будут отменены с помощью Thread.interrupt(), поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.
Если отмена действительно не работает, и вы просто хотите отказаться, вы можете заменить System.err.println()
заявление, в приведенном выше коде с System.exit()
.
И ваша логика задачи нити также должна иметь дело с прерыванием:
public class PrimeProducer extends Thread {
private final BlockingQueue<BigInteger> queue;
PrimeProducer(BlockingQueue<BigInteger> queue) {
this.queue = queue;
}
public void run() {
try {
BigInteger p = BigInteger.ONE;
while (!Thread.currentThread().isInterrupted())
queue.put(p = p.nextProbablePrime());
} catch (InterruptedException consumed) {
/* Allow thread to exit */
}
}
public void cancel() { interrupt(); }
}
Также обратите внимание, если вы не подклассы темы, но вместо реализации Runnable для типа библиотеки коды, то вы не хочу проглотить прерывания, как описано выше, но вместо этого вы хотите, чтобы восстановить прерванное состояние, подобное ниже (читать «Работу с InterruptedException» ниже, чтобы понять, почему при восстановлении прерванного статуса желательно библиотеки коды):
public class TaskRunner implements Runnable {
private BlockingQueue<Task> queue;
public TaskRunner(BlockingQueue<Task> queue) {
this.queue = queue;
}
public void run() {
try {
while (true) {
Task task = queue.take(10, TimeUnit.SECONDS);
task.execute();
}
}
catch (InterruptedException e) {
// Restore the interrupted status
Thread.currentThread().interrupt();
}
}
}
См. Также некоторые справочные документы (из которых некоторые из информации в этом ответе была скопировать и вставили):
Возможно, на вопрос http://codereview.stackexchange.com/ – ManoDestra
, как вы завершаете приложение FX, и как вы запускаете фоновый поток? также я предполагаю, что вы не проходите мимо 'thread.setDaemon (true)' – AntJavaDev
, пожалуйста, опубликуйте изменения в своем вопросе, а не в комментариях. – AntJavaDev