LINUX.ORG.RU

Здесь есть какой-нибудь фанатик java? я хочу высказать своё «фи», и посмотреть что он ответит :-(


0

0

имеется класс: jtClient extends Thread

допустим я его где-нибудь запустил: jtClient a = new jtClient(); a.start();

теперь представим, что где-то в a.run() рпоизошла ошибка(неполучилось соединиться с ServerSocket к примеру)

==>вопрос<==: какого хрена нужно пересоздавать целый класс (a=new jtClient()) чтобы произвести перезапуск нити? это же убожество! :-(

я весь вечер писал класс интерфейса в расчёте на то, что для перезапуска нити ненужно её пересоздавать :(( АААА!!

представил монструозный класс пересоздающийся при вшивой ошибке... уже только из-за этого этот язык(или реализацию, хз) можно выбросить на свалку...

> какого хрена нужно пересоздавать целый класс
(Уныло) Класс пересоздавать не надо. Надо пересоздать объект

> в расчёте на то, что для перезапуска нити ненужно её пересоздавать

(уныло) значит, расчет был крив.

> пересоздающийся при вшивой ошибке

По вшивым ошибкам из тредов не вылетают. Вшивые ошибки ловят внутри треда.

А если совсем пересоздавать не хочется - есть интерфейс Runnable. Его можно заимплементить, потом создать один объект - и потом подсовывать его создаваемым Thread-ам.

svu ★★★★★
()
Ответ на: комментарий от svu

>По вшивым ошибкам из тредов не вылетают. Вшивые ошибки ловят внутри треда. я отлавливаю IOException на Socket.connect(); после обработки тела catch нить закрывается с состоянием TERMINATED и после этого, похоже, можно только пересоздать по new

>есть интерфейс Runnable а вот это попробуем

мерси

AGUtilities ★★★
() автор топика
Ответ на: комментарий от anonymous

>А где "спасибо тебе, Г-ди"? вопрос звучал подругому: почему нужно пересоздавать объект треда, чтобы его перезапустить?

AGUtilities ★★★
() автор топика
Ответ на: комментарий от svu

Re^2: Здесь есть какой-нибудь фанатик java? я хочу высказать своё "фи", и посмотреть что он ответит :-(

Этим ответом svu как бы подтвердил, что он фанатик жабы :)

gaa ★★
()

try{} catch{} тебе поможет

dave ★★★★★
()

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

Pi ★★★★★
()

Мы высказали своё фи твоей неопытности, посмотрим, что ты нам ответишь

anonymous
()
Ответ на: комментарий от AGUtilities

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

wfrr ★★☆
()
Ответ на: комментарий от anonymous

>Мы высказали своё фи твоей неопытности да я понимаю что неопытный, но давайте вернёмся к нашим зайцам: я всё отлавливаю(иначе оно бы не скомпилировалось), но вопрос не в эксепшенах, а в том, что после того, что тред завершился (из-за эксепшена или без - неважно) он помечается как TERMINATED, и чтобы его перезапустить нужно пересоздать весь объект!

AGUtilities ★★★
() автор топика
Ответ на: комментарий от AGUtilities

так а чем тебя не устраевает пересоздание объекта? имхо это как раз хорошо: не будет сторонних эффектов

Pi ★★★★★
()

Я не фанатик. Но мне кажется естественным испытывать как минимум уважение (если не теплые чувства) к тому, что тебя честно кормит уже лет ... много;)

svu ★★★★★
()
Ответ на: комментарий от Pi

>не будет сторонних эффектов

но это какой-то одноразовый эффект, это же не красиво, и похоже на недоработку java :-(. Пользователь вводит имя домена, сделал очипятку и всё... целый объект нужно пересоздавать...

уже переделываю короче

AGUtilities ★★★
() автор топика
Ответ на: комментарий от AGUtilities

такие же недоработки в дотнете, питоне и рубы. ты живешь в ущербном мире :)

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

Pi ★★★★★
()
Ответ на: комментарий от AGUtilities

>Пользователь вводит имя домена, сделал очипятку и всё... целый объект нужно пересоздавать...

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

wfrr ★★☆
()
Ответ на: комментарий от wfrr

> а не создавать поток на каждый пук.

erlang-программисты смотрят на тебя как... в общем, презрительно.

anonymous
()
Ответ на: комментарий от anonymous

Косяк в том что они и на себя также смотрят.

wfrr ★★☆
()
Ответ на: комментарий от AGUtilities

>сделал очипятку и всё... целый объект нужно пересоздавать...

Компьютер железный, пусть работает. Или тебе нравится с антивирусом по предприятию бегать и виндовые проблемы лечить? Мне- нет

Karapuz ★★★★★
()

Странный ты...

Позволю себе неуместную аналогию: тред - это пищеовой продукт, запуск треда - съесть продукт, абнормальное окончание работы треда - блевотина.

А теперь вопрос. Зачем ты хочешь повторно съесть блевотину?

anonymous
()
Ответ на: комментарий от anonymous

>Позволю себе неуместную аналогию

да у меня неправильная конструкция алга, кторый я сейчас и переделываю

аналогия действительно не уместна и не правильна. ещё раз, вот допустим пользователь неправильно написал ip, по которому Socket должен подключиться. На мой взгляд не рационально что весь класс срановится неюзабельным и требует пересоздания из-за одной такой ошибки. это не рационально и не интуитивно. Даже если это неправильно, это должно быть.

AGUtilities ★★★
() автор топика
Ответ на: комментарий от AGUtilities

а типа заранее провадилировать IP перед передачей его в основное тело программы не судьба? да и потом, неужели в жабе нельзя отловить ексепшн на несоздание сокета? О_о

isden ★★★★★
()
Ответ на: комментарий от AGUtilities

Хватит уже твердить одно и то же. Ведь уже сказали, что скорее всего у
тебя _не_правильная_ архитектура приложения.

Во-первых, зачем ты наследуешь Thread? Тебе так сильно нужна "тонкая"
настройка потока?
Во-вторых, делается все намного проще. Пишется класс, который наследует
интерфейс Runnable. Объект этого класса и должен быть тяжелым. В этом
классе ты делаешь метод setLogin() или что у тебя пользователь вводит,
для того что бы ты мог объект этого класса не пересоздавать, а просто
записывать в него новые данные. Далее:

MyRunnable runnable = new MyRunnable();

...

runnable.setLogin( login );
Thread thread = new Thread( runnable );
thread.start();

В итоге твой тяжелый объект не пересоздается. Создаешь только Thread.

Ian ★★
()
Ответ на: комментарий от isden

Насколько я понял, у него проблема не в том, что что-то там по Exception вылетает и поэтому поток завершается, а в том, что один Thread на обработку одного ip от пользователя. И он не знает как сделать иначе. А иначе сделать можно.

Человек просто не умеет писать на Java. Вот и все.

Ian ★★
()
Ответ на: комментарий от Ian

И еще. Можешь попробовать поиграться с wait/notify, если не хочешь и Thread пересоздавать. Пусть вводимая пользователем информация будет разделяемыми между потоками данными.

Ian ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.