Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Подпроцессы (Threads)  (Прочитано 5817 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 21-12-2010 12:27 » 

В учебнике (http://articles.org.ru/docum/java/gl17/gl17.php) сказано, цитирую:
Цитата
Главный подпроцесс может завершиться, а программа будет продолжать работу, пока не закончит работу последний подпроцесс.

Мой код:
Код:
package main;

class Thread1 extends Thread {
    @Override
    public void run() {
        System.out.println("Thread1 started.");
        try {
            sleep(100);
        }
        catch(Exception e) {}
        System.out.println("Thread1 stoped.");
    }
}

public class Main {
    public static void main(String[] args) {
        new Thread1().start();
        System.exit(0);
    }
}
На деле выходит, что Thread1 закрывается до его завершения: на консоль печатается только "Thread1 started.". Как все-таки сделать, чтоб виртуальная машина ждала полного выполнения подпроцесса?
Записан
Asver
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #1 : 21-12-2010 13:30 » 

Не вызывайте System.exit(0);
Вызов этой функции завершаетт работу виртуальной машины.
Если не вызывать System.exit(0), то основной поток зарершиться после выхода из метода main, а второй продолжит работать.
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 21-12-2010 13:59 » 

Dr.Y, учебник, как всегда, говорит не всю правду. Потоки в Java бывают двух видов - user thread и daemon thread
Пользовательские потоки, как и написано в учебнике, выполняются после завершения потока main, и виртуальная машина ждет завершения всех пользовательских потоков.

Потоки-демоны автоматически завершаются при завершении последнего пользовательского потока. По умолчанию, потоки создаются как пользовательские, однако любой поток можно переключить в режим демона вызовом метода setDaemon(true)

Для того, чтобы гарантировать выполнение потока до конца, можно воспользоваться методом Thread.join. Этот метод блокирует вызывающий поток до завершения своего потока. В вашем примере вместо System.exit вы могли вызвать join и ждать завершения потока:
Код: (Java)
public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread1();
        thread.start();
        thread.join();
    }
}
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #3 : 21-12-2010 14:15 » 

Понял, спасибо!
У меня к вам еще один вопрос: как заставить текущий подпроцесс ожидать окончания выполнения вызваных им подпроцессов. Тоесть, если ThreadMain запустит в свою очередь Thread1, Thread2, как заставить его ожидать завершения 1-го и 2-го подпроцессов?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 21-12-2010 15:41 » 

Dr.Y, в простейшем случае вызвать join у каждого потока.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 21-12-2010 16:17 » 

Dimka, спасибо, сработало. Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines