Как Вы подвешиваете поток в Java в одной строке?

Одной строкой я имею в виду самое большее 100 символов на строку.

(Мне в основном нужно это для поддержания программы. Основной поток регистрирует слушателей обратного вызова, которые выполняются в отдельных потоках. Мне просто нужен основной, чтобы зависнуть навсегда и позволить другим потокам сделать свою работу),

6
задан rui 8 July 2010 в 11:42
поделиться

8 ответов

Есть несколько вещей, которые можно сделать лучше, чем вечное зависание начального потока:

  1. Используйте otherThread.join(). Это приведет к тому, что текущий поток, в котором вы работаете, будет спать, пока другой поток не закончит выполнение.
  2. Как советует @nanda, используйте ExcecutorService.shutdown() для ожидания завершения работы пула потоков.
  3. Используйте otherThread.setDaemon(false) и просто позвольте вашему начальному потоку выйти. Это установит ваши новые потоки как пользовательские. Java не выключится, пока единственными работающими потоками будут потоки-демоны.
12
ответ дан 8 December 2019 в 02:14
поделиться
synchronized(this) {
    while (true) {
        this.wait();
    }
}

(спасибо Карлосу Хойбергеру. Обработка исключений в приведенном выше коде опущена)

Это заставит текущий поток ждать на мониторе текущего класса, пока кто-то не вызовет notify () , или навсегда.

13
ответ дан 8 December 2019 в 02:14
поделиться

Thread.sleep (Long.MAX_VALUE);

Хорошо, это не навсегда, но поговорим о действительно долгом времени :)

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

Используйте исполнителя. Используя метод shutdown(), вы заставите исполнителя ждать, пока все потоки не завершат работу.

5
ответ дан 8 December 2019 в 02:14
поделиться

С помощью CountDownLatch вы можете подождать, пока обратный отсчет не достигнет 0, если вы убедитесь, что обратный отсчет никогда не идет, возможно только когда ему нужно закончить. (Это также приводит к 0% cpu, противоположность циклам, которые будут выполняться вечно, и с join () ваше приложение все равно завершится, когда все другие потоки будут завершены, вариант исполнителя лучше, но также завершится, когда все выполненные задачи закончили)

4
ответ дан 8 December 2019 в 02:14
поделиться

Вы можете использовать thread.join для ожидания всех потоков.

3
ответ дан 8 December 2019 в 02:14
поделиться
public static void main(String[] args) {
    Thread t = new Thread() {
        @Override
        public void run() {
            try {
                while (true) {
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
            }
        }
    };
    t.setDaemon(false);
    t.start();
}
0
ответ дан 8 December 2019 в 02:14
поделиться
for(;;);

Но очень маловероятно, что подвешивание нити - это то, что вам нужно. Вместо этого вам стоит рассмотреть такие варианты, как присоединение к другим нитям.

-1
ответ дан 8 December 2019 в 02:14
поделиться
Другие вопросы по тегам:

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