Основной поток не хочет закрывать ресурс, потому что порожденный поток выполняется асинхронно .
В пределах try
, task.start()
начинает выполнение потока, но этоне ждет, пока это закончится.Следовательно, возможно (даже вероятно), что основной метод достигнет конца своих try
до завершения DaytimeThread.run()
.
Если основной метод try
был попыткой с ресурсами,соединение будет закрыто в это время.Затем, когда DaytimeThread
продолжает выполнять свою работу в другом потоке, он попытается использовать это соединение после его закрытия.
Но чтобы ответить на ваш настоящий вопрос:
почему основной поток хочет закрыть сокет из другого потока
Это не сокет из другого потока.Фактически, метод main принимает подключение к сокету и затем передает его DaytimeThread
.
Обычно , объекту, отвечающему за получение близкого ресурсатакже должен нести ответственность за его закрытие.Простой способ сделать это - попробовать с ресурсами.Тем не менее, этот принцип не может быть применен с этим дизайном, потому что поток может нуждаться в ресурсе после того, как основной поток закончил с ним.