Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
parkito
11 / 11 / 9
Регистрация: 22.03.2010
Сообщений: 693
1

Почему демоны не завершаются после завершения main

12.08.2016, 00:55. Просмотров 343. Ответов 3
Метки нет (Все метки)

Здравствуйте. Помогите, пожалуйста, разобраться в следующем вопросе.
Теория гласит, что потоки-демоны завершаются после того, как завершатся все потоки НЕдеомны.
Пытаюсь это проверить. Но сталкиваюсь с проблемой того, что не могу получить точное время выполнения потока. Если использовать
Java
1
System.currentTimeMillis()
, то получу не совсем точное время работы потока. А для доказательства правильной работы демонов нужно именно вычисление точных временных интервалов работы. Возможно ли как-то, постфактум, опретделить время потока достаточно точно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2016, 00:55
Ответы с готовыми решениями:

Самоудаление программы после завершения ее работы
Как можно реализовать самоудаление программы после завершения ее работы? Мой...

Почему i не может увидеть, то что было написанно в main?
class Example { public static void main (String args){ int i; i = 1000;...

Потоки демоны
Необходимо разработать программу, выполняющую сортировку массива методом...

Exception in thread "main" java.lang.NullPointerException at Main.main
Извините, перемещю в нужный раздел как только найду как это сделать Задание:...

Как напечатать переменную 1 раз после завершения потока?
package com.company; class MyThread extends Thread { static int a =...

3
xoraxax
1377 / 1310 / 390
Регистрация: 05.07.2013
Сообщений: 6,327
Завершенные тесты: 2
12.08.2016, 08:55 2
открой jvisualvm и посмотри, например
0
turbanoff
Эксперт Java
4018 / 3753 / 741
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 11
Завершенные тесты: 1
12.08.2016, 15:46 3
Я не понял, как связана задача опредления времени работы потока с потоками-демонами?

Добавлено через 26 секунд
А вопрос, который вы задаёте в теме актуален? Или они всё таки завершаются у вас?
0
miktim
8 / 8 / 11
Регистрация: 14.08.2016
Сообщений: 54
19.08.2016, 20:24 4
При завершении main, демоны убиваются без нотификации.

TestThread.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.lang.Thread;
 
class TestThread extends Thread {
  long sleepMillis = 0;
  
  public static void main(String[] args) throws Throwable {
    inform("start");
    new TestThread().set("daemon-1",true, 500).start();
    new TestThread().set("user",false, 1000).start();
    new TestThread().set("daemon-2",true,1500).start();
    Thread.sleep(200);  // даем время всем стартовать
    Thread[] ta = new Thread[Thread.activeCount()];
    Thread.enumerate(ta); // формируем список потоков
    ta[1].interrupt();    // убиваем daemon-1
    ta[1].join();
    for (int i=0; i<ta.length; i++) {
      System.out.println(ta[i] + " isAlive=" + ta[i].isAlive()); // вывод состояния потоков
    }
    inform("end");
  }
  public static void inform(String s) {
    System.out.println(s + " " + Thread.currentThread());
  }
  
  TestThread set(String name, boolean daemon, long millis) {
    this.setName(name);
    this.setDaemon(daemon);
    this.sleepMillis = millis;
    return this;
  }
  public void run() {
      inform("start");
      try {
        Thread.sleep(this.sleepMillis);  // Сп-а-а-а-а-ать!
      } catch (Throwable ex) {
        System.out.println(ex);
      }
      inform("end");
  }
}
В консоли:
start Thread[main,5,main]
start Thread[daemon-1,5,main]
start Thread[user,5,main]
start Thread[daemon-2,5,main]
java.lang.InterruptedException: sleep interrupted
end Thread[daemon-1,5,main]
Thread[main,5,main] isAlive=true
Thread[daemon-1,5,] isAlive=false
Thread[user,5,main] isAlive=true
Thread[daemon-2,5,main] isAlive=true
end Thread[main,5,main]
end Thread[user,5,main]
Как видите, main ожидает завершения user, убивает daemon-2, который и пискнуть не успевает.

Добавлено через 7 часов 7 минут
To turbanoff, xoraxax. Вопрос поста состоит в следующем: есть ли жизнь после смерти?
Т.е. :
- можно ли это принудительное завершение перехватить внутри объекта-Thread (user/daemon без разницы: перед Ctl+C все равны) ?;
- есть ли иные методы (ExecutorService?) запуска потоков, позволяющие подобный перехват?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2016, 20:24

Почему в качестве параметра метода main() мы передаём пустой строчный массив?
Добрый Вечер!!! Скажите Пожалуйста, почему в качестве параметра метода main()...

Сохраняется ли кэш скомпилированного байт-кода после завершения программы
Хотел бы узнать, сохраняется ли кэш скомпилированного байт-кода...

Потоки демоны (Daemon threads)
Объясните зачем нужны потоки-демоны. В каких случаях они применяются ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru