powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / как синхронизировать смерть объектов
11 сообщений из 11, страница 1 из 1
как синхронизировать смерть объектов
    #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
как синхронизировать смерть объектов
    #38804205
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем? Сборщик уберет когда это будет нужно и вообще finalize - зло, которое стоит использовать в ИСКЛЮЧИТЕЛЬНЫХ случаях
...
Рейтинг: 0 / 0
как синхронизировать смерть объектов
    #38804206
tramadol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

тоесть без финалайза поток тоже убъется когда GC прийдет за объектом который его запустил?
...
Рейтинг: 0 / 0
как синхронизировать смерть объектов
    #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
как синхронизировать смерть объектов
    #38804223
tramadol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

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

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

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

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

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

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

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

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

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

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


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