Перейти к публикации
  • Сейчас на странице   Всего пользователей: 0   (0 пользователей, 0 гостей)

Hed-kun

Программирование, т. 3

Рекомендованные сообщения

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

 

а вот как while(true) прерывать?

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

Поделиться сообщением


Ссылка на сообщение
Гость 2poy_nyasha

он разве не всю программу прервет?

 

Кстати, вот что лучше использовать String или StringBuffer и когда и почему?

 

хотя, никто не мешает сделать типа

volatile name(){

while(true) {

if(...) break;

}

}

 

и просто менять условие, но это тоже примитив

Поделиться сообщением


Ссылка на сообщение
(изменено)

он разве не всю программу прервет?

 

Кстати, вот что лучше использовать String или StringBuffer и когда и почему?

 

хотя, никто не мешает сделать типа

volatile name(){

while(true) {

if(...) break;

}

}

 

и просто менять условие, но это тоже примитив

Эксепшен ты можешь перехватить в блоке try{}catch(...){}

StringBuffer лучше вообще не использовать, он очень медленный и устаревший, лучше использовать StringBuilder.

 

Если ты делаешь простые конкатенации строк и сразу вывод, то можно использовать String, но если ты, например, тащишь строку через весь код или нужно постоянно ее дописывать в циклах или еще где, то конечно лучше использовать StringBuilder.

 

Вот простой пример:

у тебя есть метод которые печатает страницу:

public void printPage(OutputStream out)
{
String outputString = "";
outputString += printHead();
outputString += printBody();
out.print(outputString);
}

в данном случае намного лучше использовать StringBuilder, так как при каждом присваивании outputString += будет создаваться новый объект в куче, может в маленьких масштабах это и не заметно, но в больших проектах это очень хорошо видно, в таком случае рекомендуют писать так:

public void printPage(OutputStream out)
{
StringBuilder sb = new StringBuilder();
printHead(sb);
printBody(sb);
out.print(sb.toString);
}

 

методы же printHead и printBody в свою очередь внутри себя будут вызывть метод append.

 

Еще один классический пример, это набивание текста в цикле:

String str = "";
for(int i = 0; i < 1000; i++)
{
 str+="i = "+i;
}

 

тут каждый раз в цикле будет создаваться новая строка и присваиваться переменной str, старая же будет удалена только когда сработает gc.

по-этому лучше делать так:

final String STR_I = "i = ";

StringBuilder sb = new StringBuilder();
for(int i = 0; i < 1000; i++)
{
 sb.append(STR_I).append(i);
}

 

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


Изменено пользователем DIMAN123456789

Поделиться сообщением


Ссылка на сообщение
Гость 2poy_nyasha

Хм, Ноутон и Шилдт не говорил ни слова про StringBuilder, но зато говорил что String не может контачиться с другой строкой, а может только менять указатель на новую строку.

 

На джаве кто-то пишет веб?

 

и да, надо ли вообще париться на счет gc или можно забить?

Поделиться сообщением


Ссылка на сообщение

а вот как while(true) прерывать?

а ты знаешь другой способ прерывания бесконечного цикла кроме как break'ом?

 

просто допустим убийство потока считается говнокодом и допустим в шарпе на даный момент вообще выпилено, в джаве не уверен, но вроде бы тоже

 

Хм, Ноутон и Шилдт не говорил ни слова про StringBuilder, но зато говорил что String не может контачиться с другой строкой, а может только менять указатель на новую строку.

StringBuilder sb = new StringBuilder("hui"); sb.Append(str1); sb.Append(str2); ... sb.Append(strN);

>>>>

string str = "hui"; str += str1; str += str2; ... str += strN;

 

как-то так

Поделиться сообщением


Ссылка на сообщение

Хм, Ноутон и Шилдт не говорил ни слова про StringBuilder, но зато говорил что String не может контачиться с другой строкой, а может только менять указатель на новую строку.

StringBuilder sb = new StringBuilder("hui"); sb.Append(str1); sb.Append(str2); ... sb.Append(strN);

>>>>

string str = "hui"; str += str1; str += str2; ... str += strN;

 

как-то так

Что ты хотел сказать этим?

Поделиться сообщением


Ссылка на сообщение

он спрашивал когда юзать билдер а когда стринг :dunno:

Поделиться сообщением


Ссылка на сообщение

он спрашивал когда, а не как :avtorklif:


За своей обоссаной помойкой следи, где блять инвалидам платится под 200к, половина трансферов уходит вникуда, молодежь превращается в полнейшее гавно и по кд все ноют

гг мю

Поделиться сообщением


Ссылка на сообщение

ну так я и привёл пример ситуации когда билдер лучше стринга

Поделиться сообщением


Ссылка на сообщение

спасибо, теперь понял что я упустил. рли спасибо

самый главный совет.

Эту задачу не надо решать рекурсией. Обычный цикл.

Про возведение в степень, факториал и числа Фибоначчи - самые распространенные примеры на рекурсию в книгах. Но рекурсия там нахуй не нужна. Она будет работать гораздо медленней и жрать на порядки больше ресурсов.

 

 

Двапою:

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

Из-за этого, если ты в цикле добавляешь к строке допустим какой-то индекс цикла + слово, твоя строка будет с каждым разом заново выделять память на ВСЮ строку, и с каждым разом делать это соответственно всё медленней.

СтрингБилдер уже выделяет при добавлении память только под новый кусок. Из-за этого получается намного быстрее добавление.

В конце просто у стрингбилдера вызвать ToString() и получить обычную строку.

 

а вот как while(true) прерывать?

а ты знаешь другой способ прерывания бесконечного цикла кроме как break'ом?

 

просто допустим убийство потока считается говнокодом и допустим в шарпе на даный момент вообще выпилено, в джаве не уверен, но вроде бы тоже

в смысле выпилено? :palevo:


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

Поделиться сообщением


Ссылка на сообщение

Ну тред.стоп() в шарпе не даёт заюзать этот метод и говорит, что этот метод is obsolete. Или я его с чем-то путаю, но когда я хотел останавливать поток извне у меня это не получалось.

Поделиться сообщением


Ссылка на сообщение

Хм. А как они тогда предполагают прерывать внутренний поток, например, когда у тебя прога закрывается?


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

Поделиться сообщением


Ссылка на сообщение

IsBackground = true (или наоборот false, я блядь всегда и путаю)

Когда выставлен правильный параметр, то при остановке главного потока такой поток тоже отваливается.

Поделиться сообщением


Ссылка на сообщение

Не, ну это понятно.

 

Вот например.

У меня в доп потоке идет запрос к базе.

В этот момент тупорылый юзер жмет крестик.

Я ловлю событие, вижу, что поток запроса еще работает и спрашиваю этого утырка подтверждение.

Если он все равно хочет выйти, я убиваю поток, сохраняю изменения и выхожу.

 

А как теперь убить? :hmm:

 

Либо я делаю всё через жопу, в чем я буду не удивлен.


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

Поделиться сообщением


Ссылка на сообщение

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

 

http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx

 

Вот тут, некоторые методы управления состоянием потока извне (в частности стоп саспенд резьюм) помечены obsolete

 

Не, ну это понятно.

 

Вот например.

У меня в доп потоке идет запрос к базе.

В этот момент тупорылый юзер жмет крестик.

Я ловлю событие, вижу, что поток запроса еще работает и спрашиваю этого утырка подтверждение.

Если он все равно хочет выйти, я убиваю поток, сохраняю изменения и выхожу.

 

А как теперь убить? :hmm:

 

Либо я делаю всё через жопу, в чем я буду не удивлен.

Никак, или жди конца работы изнутри потока или же закрывай программу, а поток сам отвалится

Поделиться сообщением


Ссылка на сообщение

Хм, саспенд устаревший, а слип, который саспенд на время, не устаревший :trollface:

 

Есть вообще какие-нибудь книги по потокам?

А то у меня часто создается впечатление, что я делаю всё через жопу. А найти, как правильно, не выходит


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

Поделиться сообщением


Ссылка на сообщение

на хабре должно быть овер 9к статей на эту тему, она очень заезжена

Поделиться сообщением


Ссылка на сообщение

http://habrahabr.ru/post/164487/

 

:trollface:

 

Хабр вообще работает на какой-то магии.

Только мне нужна статья, и она сразу появляется на главной


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

Поделиться сообщением


Ссылка на сообщение
Гость 2poy_nyasha

http://habrahabr.ru/post/164487/

 

:trollface:

 

Хабр вообще работает на какой-то магии.

Только мне нужна статья, и она сразу появляется на главной

охуенная статья, хоть я это все читал вчера

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

Поделиться сообщением


Ссылка на сообщение

http://habrahabr.ru/post/164487/

 

:trollface:

 

Хабр вообще работает на какой-то магии.

Только мне нужна статья, и она сразу появляется на главной

я только что как раз зашёл сюда чтобы её отпостить dance.gif

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...