Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Threads & lists, будте осторожнее! 
:(
    Опции темы
Domestic Cat
Дата 22.11.2004, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



я посмотрел аналогичный код со 100 тредами:

Код

import java.util.*;

public class B
{  
   public static void main(String[] args)    
   {
       try
       {
           Thread.sleep(2000);
       }catch (Exception e) {}
       final LinkedList list = new LinkedList();
       for (int i = 0; i < 100; i++)
       {
           Thread t = new Thread() { public void run() { System.out.println("t - done");
           try
           {
               Thread.sleep(1000);
            }catch (Exception e) {}
           synchronized(list)
           {
               list.remove(this);
           }
               }};
           list.add( t);
           t.start();
       }
       try
       {
           Thread.sleep(10000);
       }catch (Exception e) {}

   }

}


Ничего плохого нe происходит - изнача льно есть 8 тредоv JVM, 1 main тред, затем их число растет до 109, и череz секунду падает дo 9. Так что проблема в чем-тo другом. Например, у тебя все синхронизировано нa листe. Если какой-тo другой тред (не тот для которогo тy постил коd) "смотрит" лист в синхронизированном блокe и достаточо часто, тo возможно что он тем самым блокирует доступ к листу другим треда, и они ждут момента kогда смогут себя удалить. Может, еще чт о. А зачем вообще тебе лист?




--------------------

PM   Вверх
Sleepy_PIP
Дата 22.11.2004, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



да, подобные примеры я то-ж гонял, пытаясь понять. может и правда дело в другом, но уже все излазил вдоль и поперек. Самое интересное что колл-во тхреадов все-ж падает изредка до расчетного ...
Зачем листы? - я с их помощъю контролю тхреды и просто банально собираю статистику по коллв-у тхреадов.
А как еще узнать сколько все собственных тхреадов в _данный_ момент? - оно-ж плавает здорово ... на гдоб. переменных все делать?. но тогда я не смогу обращаться к классным переменным конкр. тхреада ...



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 22.11.2004, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172





smile Треды всегда принадлежат к-л ThreadGroup:
http://java.sun.com/j2se/1.4.2/docs/api/ja...hreadGroup.html
Создай свой ThreadGroup, и добавляй в него треды, указывая ThreadGroup в конструкторе:
http://java.sun.com/j2se/1.4.2/docs/api/ja....lang.Runnable)
Тогда узнать количество тредов можно через activeCount():
http://java.sun.com/j2se/1.4.2/docs/api/ja...l#activeCount()


--------------------

PM   Вверх
igon
Дата 23.11.2004, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 1
Всего: 21



Идея такая (возможно, бесполезная - на практике не проверял):
Так как причина проблемы, тебя беспокоящей, в наличии неубранных из листов "мертвых" ссылок, хранить в листах не ссылки, а ИМЕНА тредов!
1.Каждый тред обзывешь уникально (setName("Имя")), имя фиксируешь в листе
2.Если нужно обратиться к какому-нибудь треду, с помощью метода
enumerate(Thread[] tarray) получаешь массив активных тредов и перебором (tarray[i].getName() = "Имя") ищешь тред с нужным именем и - обращаешься.
3.По окончании работы работы тред чистит свое имя в листе и умирает - ИМХО, без фантомов

Возможные осложнения: метод enumerate - static, возвращает "...every active thread in the current thread's thread group and its subgroups...". Что он вернет при вызове в виде Thread.enumerate(tarray) из, допустим, обработчика событий и какой тред будет при этом считаться current - совершенно не представляю, надо пробовать.

И, btw, действительно ли необходимо устанавливать и рвать connection к БД в каждом треде? Через один постоянный connection в БД можно спокойно закачать то, что "нароет" целая куча ftp тредов


--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 23.11.2004, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Вообще-то идея "регистрации" тредов не совсем правильная в данном контексте. Треды ведь все одинаковы? КАждый тред самодостаточен ? Обеспечиваем взаимодействие через synchronized (notify, wait) и всего делов. Зачем же их искусственно "метить" ?


--------------------

PM   Вверх
igon
Дата 23.11.2004, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 1
Всего: 21



Цитата
Треды ведь все одинаковы?

В контексте простого подсчета активных - да!

Но ведь нужно
Цитата
обращаться к классным переменным конкр. тхреада

(btw, в классных переменных=переменных класса=static переменных нельзя хранить особенности состояния конкретного треда - они общие для всех instance класса)

В случае
Код


      for (int i = 0; i < 100; i++)
      {
          Thread t = new Thread()
          ...
          t.start();
         
...

и "долгоживущих" тредов как мне узнать, сколько, скажем, информации "накачал" тред, созданный в 54 итерации, не используя сохраненные ссылки на него?
Да и в GUI для мониторинга произвольных тредов лучше показывать их имена, а не адреса smile
Еще раз подчеркну - идея далеко не бесспорна и действительно зависит от решаемых задач, но
Цитата
не совсем правильная
- это же не "совсем неправильная" smile


--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 23.11.2004, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(Sleepy_PIP @ 22.11.2004, 12:08)
на гдоб. переменных все делать?. но тогда я не смогу обращаться к классным переменным конкр. тхреада ...


глобальных переменных вообще не существует (в Java), р5аз уж на то пошло, статические переменные и есть в некором смысле глобальные.
Цитата(igon @ 22.11.2004, 20:29)
и "долгоживущих" тредов как мне узнать, сколько, скажем, информации "накачал" тред, созданный в 54 итерации, не используя сохраненные ссылки на него?


раз все треды равны, то какая хрен разница какой тред что скачал, и вообще какое у треда имя. smile


--------------------

PM   Вверх
Sleepy_PIP
Дата 23.11.2004, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



Цитата(Domestic @ 23.11.2004, 05:56)
Цитата(Sleepy_PIP @ 22.11.2004, 12:08)
на гдоб. переменных все делать?. но тогда я не смогу обращаться к классным переменным конкр. тхреада ...


глобальных переменных вообще не существует (в Java), р5аз уж на то пошло, статические переменные и есть в некором смысле глобальные.
Цитата(igon @ 22.11.2004, 20:29)
и "долгоживущих" тредов как мне узнать, сколько, скажем, информации "накачал" тред, созданный в 54 итерации, не используя сохраненные ссылки на него?


раз все треды равны, то какая хрен разница какой тред что скачал, и вообще какое у треда имя. smile

при чем здесь стат. переменные.???
Я храню в классе тхреада не несколько переменных - они специфичны для каждого экземпляра класса. и они мне нужны!.
По поводу именования - они (тхреады) и так автоматом именуются уникально, но хранить имена - мало. нужен доступ до переменных.


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 23.11.2004, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата
Я храню в классе тхреада не несколько переменных - они специфичны для каждого экземпляра класса. и они мне нужны!.
По поводу именования - они (тхреады) и так автоматом именуются уникально, но хранить имена - мало. нужен доступ до переменных.


а можно узнат', что это зa переменныe?


--------------------

PM   Вверх
Sleepy_PIP
Дата 23.11.2004, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



Цитата(Domestic @ 23.11.2004, 16:20)
Цитата
Я храню в классе тхреада не несколько переменных - они специфичны для каждого экземпляра класса. и они мне нужны!.
По поводу именования - они (тхреады) и так автоматом именуются уникально, но хранить имена - мало. нужен доступ до переменных.


а можно узнат', что это зa переменныe?

public class GetListThr extends Thread
{
public static final long SQLockConflict=335544345;
public static final long SQLDeadLockConflict=335544336;
public boolean StartMake=false;

private PIPFTPSite ftps;
private byte conncount=0;


public int TryCount;
public PIPLog llog=PIPFTPSGetList.Gconf.llog;
public DBWork dbw=PIPFTPSGetList.Gconf.dbw;
public DBConnItem dbc;
public boolean notConnected;
private PreparedStatement ub;
private PreparedStatement ubl;

public FTPClient lftp;

private long CountDirList=0;
....

я в чем-то ошибаюсь? где-то не правильно в корне?



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 23.11.2004, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Есть переменные, которые только треду нужны, а я имею в виду - значния каких полей тебе нужно "извне" смотреть :
Цитата
Я храню в классе тхреада не несколько переменных - они специфичны для каждого экземпляра класса. и они мне нужны!


То есть, зачем тебе нужен доступ к переменным? И к каким (только объяс)ни что они значат, по названиям можо толькo догадываться.

И еwe раз прошу : пользуйся тегами [cоde=java] [/cоde].


--------------------

PM   Вверх
Sleepy_PIP
Дата 23.11.2004, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



Цитата(Domestic @ 23.11.2004, 18:15)
Есть переменные, которые только треду нужны, а я имею в виду - значния каких полей тебе нужно "извне" смотреть :
Цитата
Я храню в классе тхреада не несколько переменных - они специфичны для каждого экземпляра класса. и они мне нужны!


То есть, зачем тебе нужен доступ к переменным? И к каким (только объяс)ни что они значат, по названиям можо толькo догадываться.

И еwe раз прошу : пользуйся тегами [cоde=java] [/cоde].

Код

public class GetListThr extends Thread
{
public static final long SQLockConflict=335544345;
public static final long SQLDeadLockConflict=335544336;
public boolean StartMake=false;

private PIPFTPSite ftps; //-мой класс с необходимым описателем FTP сайта. используется в контрольном тхреде для статистики и отображения в интерф. тхреде.
private byte conncount=0;


public int TryCount; //- колл-во попыток коннекта - используется контрольным тхреадом для статистики и отображения в интерфейстном тхреаде.
public PIPLog llog=PIPFTPSGetList.Gconf.llog;
public DBWork dbw=PIPFTPSGetList.Gconf.dbw;
public DBConnItem dbc;
public boolean notConnected; // - используется контрольным тхреадом для установления факта нормального завершения конструктора GetListThr(..) и возможности создавать новые тхреады GetListThr
private PreparedStatement ub;
private PreparedStatement ubl;

public FTPClient lftp;

private long CountDirList=0;
....




--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 23.11.2004, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Все это можно делать, но в обратном направлении: например ты спрашиваешь тред извне сколько было попыток коннекта. Но можно передавать тредам ссылку на объект, который заведует статистикой, так чтобы треды сами сообщали ему нужые данные.


Добавлено @ 18:54
ПС: спасибо за использование подсветки


--------------------

PM   Вверх
Sleepy_PIP
Дата 23.11.2004, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



понял, понял. я это уже продумывал, но решил что так - банально писать меньше smile ... а ничего плохого в таком подходе я не нашел ... ну разве что не по канонам ООП?
Добавлено @ 19:13
Цитата(Sleepy_PIP @ 23.11.2004, 19:07)
понял, понял. я это уже продумывал, но решил что так - банально писать меньше smile ... а ничего плохого в таком подходе я не нашел ... ну разве что не по канонам ООП?

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


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 23.11.2004, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



ну тогдa ищи проблему с листом, почему гц запаздывает со сборкой. Может, где-то еще ты хранишь ссылки на треды smile Может, там где инфу с них собираешь?


--------------------

PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.