Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / как синхронизировать смерть объектов / 11 сообщений из 11, страница 1 из 1
13.11.2014, 03:13
    #38804202
tramadol
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как синхронизировать смерть объектов
имеется примерно следующая схема:
Код: 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.
class A{

    private B b = new B();

    public A(){
      b.start();
    }

   /*some code goes here*/

    @Override
    protected void finalize() throws Throwable {
        b.interrupt();
        super.finalize();
    }

   private class B extends Thread{
        private void doSomeThings(){
         /*some code goes here*/
        }
        @Override
        public void run() {
            while (true){
                doSomeThings();
            }
        }
   }

}



собственно вопрос: почему за объектом класса А не приходит GC когда он свое отработал и я даже вручную единственной ссылке на этот объект присваиваю null?
тоесть получается после того как объект класса А свою работу сделал и стал не нужен, поток B продолжает крутится в цикле.
или подскажите как можно по другому сделать чтобы когда объект класса A отработал свое и стал не нужен, он убивался одновременно с потоком B
...
Рейтинг: 0 / 0
13.11.2014, 03:33
    #38804205
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как синхронизировать смерть объектов
Зачем? Сборщик уберет когда это будет нужно и вообще finalize - зло, которое стоит использовать в ИСКЛЮЧИТЕЛЬНЫХ случаях
...
Рейтинг: 0 / 0
13.11.2014, 03:43
    #38804206
tramadol
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как синхронизировать смерть объектов
забыл ник,

тоесть без финалайза поток тоже убъется когда GC прийдет за объектом который его запустил?
...
Рейтинг: 0 / 0
13.11.2014, 04:36
    #38804215
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как синхронизировать смерть объектов
tramadol,

Код: 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.
class A implements AutoCloseable {

	private B b = new B();

	public A() {
		b.start();
	}
	
	private class B extends Thread {
		
		private void doSomeThings() throws InterruptedException {
			System.out.println("Hello, World !!!");
		}

		@Override
		public void run() {
			try {
				while (!isInterrupted()) { // "крутим" пока не получим сигнал прерывания
					doSomeThings();
				}
			} catch (InterruptedException e) {
				System.out.println("Interrupted!"); // здесь уже прервано
			}
		}
	}

	@Override
	public void close() throws Exception {
		System.out.println("Interrupting..."); // завершаем работу A
		b.interrupt(); // прерываем B
	}
}

public static void main(String[] args) throws Exception {
    try (A a = new A()) {
        System.out.println("...");
    } // метод close() будет вызван автоматически
}
...
Рейтинг: 0 / 0
13.11.2014, 05:32
    #38804223
tramadol
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как синхронизировать смерть объектов
Usman,

спасибо за идею, но мне нужно чтобы это все убивалось без использования try with resources
...
Рейтинг: 0 / 0
13.11.2014, 08:43
    #38804277
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как синхронизировать смерть объектов
tramadolUsman,

спасибо за идею, но мне нужно чтобы это все убивалось без использования try with resources
какие-то религиозные убеждения?
...
Рейтинг: 0 / 0
13.11.2014, 09:01
    #38804297
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как синхронизировать смерть объектов
tramadolтоесть без финалайза поток тоже убъется когда GC прийдет за объектом который его запустил?
Вас обременяют знания из другой технологии, и вы зачем-то проецируете их на Java.
finalize() нельзя использовать. Вообще. Для чистки ресурсов по сборке мусора используется PhantomReference - но это отдельная тема и она тоже не везде применима.
Если у вас поток каким-то образом ссылается на объект А, то GC никогда его не соберет, пока поток жив.
Вы всегда можете воспользоваться профайлером (например JDK/bin/jvisualvm.exe) чтобы узнать что именно держит ссылку на ваш объект.

Ваш подход уже вскрыл свои критические недостатки, но вы отказываетесь их замечать. Нельзя привязывать ресурсы к времени жизни объекта в Java, не имея на то веских причин.
...
Рейтинг: 0 / 0
13.11.2014, 09:02
    #38804298
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как синхронизировать смерть объектов
tramadol,

Код: java
1.
new A().close();
...
Рейтинг: 0 / 0
13.11.2014, 14:31
    #38804932
tramadol
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как синхронизировать смерть объектов
DDiver,

мне кажется неудобно будет использовать библиотеку только с try-with-resources
...
Рейтинг: 0 / 0
13.11.2014, 14:33
    #38804933
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как синхронизировать смерть объектов
tramadolDDiver,

мне кажется неудобно будет использовать библиотеку только с try-with-resources
А библиотеку с недетерминированым поведением удобно использовать?
...
Рейтинг: 0 / 0
13.11.2014, 23:05
    #38805559
maxkar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как синхронизировать смерть объектов
tramadol,

Выше уже правильно заметили, что в подобных случаях нужно давать метод ручного управления ресурсами. И программисты должны его использовать. finalize можно делать только как защиту от ошибок программистов, чтобы лишние потоки не висели. При этом желательно куда-нибудь ругнуться, что ресурс не был освобожден правильно.

По сути вопроса.

tramadolи я даже вручную единственной ссылке на этот объект присваиваю null?
Это той, которая есть внутри вашего B (inner class)? До нее вообще-то так просто не добраться, да и не нужно обычно. Или все-таки вы про какую-то другую ссылку? Ну тогда работающий поток будет держать ваш A. Отказывайтесь от inner class.

А еще GC недетерминирован. И ваш объект может не собираться сборщиком мусора просто из вредности. Так что finalize для завершения потока - это именно защитная мера, чтобы _уже случившаяся_ ошибка управления ресурсами не слишком влияла на приложение.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / как синхронизировать смерть объектов / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]