2014-08-02 3 views
2

Моя программа запускается в основном и запускает несколько потоков, которые выполняют работу программы (чтение датчиков, обновление базы данных, отображение информации на экране). Я хочу, чтобы программа работала неограниченно долго.Способы поддержания бесперебойной работы Java-программы, которая эффективна?

На данный момент после того, как мои темы стали в основном я просто:

public static void main(String []args) 
{ 
    //threads start here 
    while(true) {} 
} 

Очевидно, что это работает, но мне интересно, если это тратить ресурсы зацикливания.

Есть ли эффективный способ держать программу в рабочем состоянии. Есть ли изящный способ выхода? i.e начните прослушиватель событий в главном, который прослушивает клавиатуру или событие или что-то еще?

Я также попробовал это, если это лучше:

while(true) { 
    TimeUnit.HOURS.sleep(1); 
} 

EDIT: подробнее о резьбе:

Я не уверен, какой тип резьбы они. Я реализую интерфейс под названием gnu.io.SerialPortEventListener, который запускает и обрабатывает потоки, поэтому его отвлекает от меня. Мне нужно взглянуть на API, хотя я думаю, что это плохо документировано, или посмотрите на источник, я думаю. Они сохраняют JVM в среде IDE (blueJ), но не при запуске программы в командной строке. Я просто использую метод интерфейса, чтобы добавить прослушиватель событий в COM-порт, который запускает потоки.

+1

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

+0

Теперь спасибо, спасибо –

+0

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

ответ

5

Если ваши темы не являются daemon threads Я не понимаю, почему у вас должно быть какое-то время или в этом отношении какие-либо петли, которые просто будут есть ваш процессор. Ваш основной поток не будет убит, если все потоки не-демона не будут завершены. Также, если вы хотите сделать очистку, вы можете зарегистрировать JVM's shutdown hook.

+0

Да, когда я запускаю программу в терминале, она только начинается, а затем закрывается. Если я положил while (true) {} в main, он отлично работает. Я пишу на терминал, поэтому я не хочу, чтобы он закрывался. –

+1

@c_breeez: Аникет правильный, 1+. Вы обеспокоены тем, что либо потоки, которые вы запустили, заканчиваются по какой-либо причине (почему?), Или они являются потоками демона, которые не поддерживают JVM (почему они являются потоками демона?). Вам нужно выяснить, почему. –

+0

Если вы явно не устанавливаете 'setDaemon (true)', то поведение наследуется от основного потока - основного потока в вашем случае, который по умолчанию не является демоном. –

1

Я делаю что-то подобное с серверами RMI. Вместо бесконечного цикла while вы можете использовать бесконечное ожидание().

private final Object forever = new Object(); 
synchronized (forever) { 
    try { forever.wait() } catch (InterruptedException ignore) {} 
} 

Другая проблема в том, как завершить этот сервер? Когда я хочу закончить его, я запускаю новый поток, который выдает System.exit (0); что убивает JVM. Очевидно, вам нужно запрограммировать способ доступа к этому коду.

+0

в java делает system.exit (0); убирать все, как близкие потоки, и говорить о подключении db перед выходом. Я использовал для C, где вы делаете все вручную, поэтому я не уверен, что делает JVM для вас и что вам нужно делать самостоятельно. –

+0

Не так. Вам нужно сделать все это так, как если бы вы C. У вас может быть слушатель, ожидающий нажатия кнопки. При нажатии, очистке и System.exit (0); Причина, по которой я запускаю поток shut_down, заключается в том, что я отправляю сообщение обратно вызывающему клиенту RMI и, если вы используете немедленный выход (0), это сообщение никогда не будет отправлено. Поток shut_down засыпает в течение 2 секунд перед вызовом exit(). – edharned

+0

Прохладный Я думаю, что я сделаю последовательности выключения, которые все подбирают и выходят. И, возможно, просто прослушайте событие нажатия клавиши или что-то в выключении. –

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