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

Под одной строкой я подразумеваю не более 100 символов на строку.

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

10 ответов

Решение

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

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

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

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

Thread.sleep(Long.MAX_VALUE);

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

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

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

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

Вот решение с одной строкой, в котором вам нужно добавить только одну дополнительную строку. (Вы должны добавить synchronized а также throws InterruptedException на ваш main декларация.) Кроме того, ему не требуется доступ или даже знание потоков в используемой вами библиотеке.

public static synchronized void main(String[] args) throws InterruptedException{
  ...
  YourMainClass.class.wait();  // wait forever
}

Предполагается, что вы никогда не позвоните notify на вашем основном классе, и что вы хотите выйти, если вы получите InterruptedException, (Вы можете добавить while (true) { ... } вокруг wait линия, если вы действительно хотите защититься от этого.)

while(true) { Thread.sleep(1000); }

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();
}
for(;;);

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

Другие вопросы по тегам