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

Поиск:

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


Опытный
**


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

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



Цитата(Domestic @ 23.11.2004, 19:14)
ну тогдa ищи проблему с листом, почему гц запаздывает со сборкой. Может, где-то еще ты хранишь ссылки на треды smile Может, там где инфу с них собираешь?

Спасибо! буду копать ....



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


Опытный
**


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

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



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

Код

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;

public class B
{  

 public static void main(String[] args)    
   {
     try
       {
         Thread.sleep(2000);
       }
       catch (Exception e) {}
      C ccc = new C();
      try
      {
          Thread.sleep(10000);
      }catch (Exception e) {}

  }

}


Код

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import javax.swing.Timer;

public class C   implements ActionListener
 {
   public LinkedList list = new LinkedList();
   public Timer timer = new Timer(1000,this);
   private Thread[] activeThreadArray = new Thread[200]; //200 - это с запасом
   public void actionPerformed(ActionEvent ae)
     {
       if (ae.getSource().equals(timer))
         {
           int i = Thread.enumerate(activeThreadArray);
           for (int j = 0; j< i; j++)
             {
               if (activeThreadArray[j].getName().equalsIgnoreCase("ftp33")||
                   activeThreadArray[j].getName().equalsIgnoreCase("ftp54"))
                 {
                   System.out.println("У треда "+activeThreadArray[j].getName()+
                                      " значение

переменной"+((A)activeThreadArray[j]).getCheckedVariable());
                                       // Вот и есть доступ к переменным

конкретного треда, а ссылок в листе - нет
                 }
             }
         }
     }

   public void removeFromList(String threadName)
     {
        System.out.println(threadName+" из списка удален"); // Здесь уж сам

подсуетись
     }
   public C()
     {
       for (int i = 0; i < 100; i++)
         {
           A a = new A(this);
           a.setName("ftp"+i);
           list.add(a.getName());
           a.start();
         }
       timer.start();
     }
 }


Код

public class A  extends Thread
 {
   private C parentReference; // ссылка на родителя
   private int checkedVariable;
   public int getCheckedVariable()
     {
       return  checkedVariable;
     }
   public String getThreadName()
     {
       return getName();
     }
   /** Constructor */
   A(C parentReference)
     {
       this.parentReference = parentReference;
     }

   public void run()
     {
       System.out.println(getName()+" started");
       for (checkedVariable=0; checkedVariable < 30; checkedVariable++)
         {
           try
             {
               Thread.sleep((int)(Math.random()*1000));
             }
             catch (Exception e) {}
         }
       parentReference.removeFromList(getName());
       System.out.println(getName()+" died");
     }  
 }


Программа - именно демо, так что оптимизацией здесь и не пахнет


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


Эксперт
****


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

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



Делать так можно, только вот не все треды поймаешь - что если тред завершился до того, как его загнали в массив? И все равно ведь ты ссылки на треды хранишь в массиве - было, например 50 тредов, потом стало 10. А 40 ссылок в массиве висит.


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

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


Опытный
**


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

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



Цитата
не все треды поймаешь - что если тред завершился до того, как его загнали в массив?

Код

...
          A a = new A(this);
          a.setName("ftp"+i);
          list.add(a.getName()); // (1) сначала загоняем
          a.start();    //  (2) потом стартуем тред ...... потом он завершается
...

если (2) выполняется раньше (1) - пора менять профессию smile
Ну, или, на худой конец, между (1) и (2) можно вставить Thread.sleep(1000) smile smile
Цитата
И все равно ведь ты ссылки на треды хранишь в массиве - было, например 50 тредов, потом стало 10. А 40 ссылок в массиве висит


list.add(a.getName()); добавляет в лист (массив) не ССЫЛКУ, а ИМЯ треда. ОК, чтобы более наглядно
Код

...
          a.setName("ftp"+i);
          list.add("ftp"+i);
...


Это абсолютно эквивалентно
Код

          a.setName("ftp"+i);
          list.add(a.getName());


Если под массивом подразумевался Thread[] - я ж говорю, что программа не оптимизирована. Вместо объявления стационарного заведомо большого массива правильнее определять его размерность из activeCount и далее использовать как локальную переменную в методе ActionPerformed

Это сообщение отредактировал(а) igon - 24.11.2004, 18:33


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


Опытный
**


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

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



Цитата(igon @ 24.11.2004, 18:18)
Цитата
не все треды поймаешь - что если тред завершился до того, как его загнали в массив?

Код

...
          A a = new A(this);
          a.setName("ftp"+i);
          list.add(a.getName()); // (1) сначала загоняем
          a.start();    //  (2) потом стартуем тред ...... потом он завершается
...

если (2) выполняется раньше (1) - пора менять профессию smile
Ну, или, на худой конец, между (1) и (2) можно вставить Thread.sleep(1000) smile smile
Цитата
И все равно ведь ты ссылки на треды хранишь в массиве - было, например 50 тредов, потом стало 10. А 40 ссылок в массиве висит


list.add(a.getName()); добавляет в лист (массив) не ССЫЛКУ, а ИМЯ треда. ОК, чтобы более наглядно
Код

...
          a.setName("ftp"+i);
          list.add("ftp"+i);
...


Это абсолютно эквивалентно
Код

          a.setName("ftp"+i);
          list.add(a.getName());


Если под массивом подразумевался Thread[] - я ж говорю, что программа не оптимизирована. Вместо объявления стационарного заведомо большого массива правильнее определять его размерность из activeCount и далее использовать как локальную переменную в методе ActionPerformed

что-то я запутался.
ведь:
Код

Thread.enumerate(activeThreadArray);

_добавляет_ треад в массив activeThreadArray,
и ты сам пишешь что для доступа к методам класса тхреада надо:
Код

(A)activeThreadArray[j]).getCheckedVariable()

т.е. класс тхреада (ссылка на него) все-ж сидит в массиве, или нет?

а имена ты как я понимаю хранишь в листе:
Код

list.add(a.getName());


тогда я вообще не понимаю (не вижу у тебя) - как и когда ссылка на класс тхреада уходит из массива при завершении тхреада.
Как имена удаляются - вижу, а как классы тхреадов - не понял ...
Поясните кто может пожалуста, а?
Спасибо!






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


Эксперт
****


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

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



Цитата
если (2) выполняется раньше (1) - пора менять профессию
Ну, или, на худой конец, между (1) и (2) можно вставить Thread.sleep(1000) 


Ты регистрируешь имена тредов, а потом каждую секундu их смотришь. Так воt, еслi тред завершается в 10:52:33 а ты делаешь enumerate в 10:52:56, кak ты вытянешь информацию с уже завершенного треда?

Цитата
Если под массивом подразумевался Thread[] - я ж говорю, что программа не оптимизирована. Вместо объявления стационарного заведомо большого массива правильнее определять его размерность из activeCount и далее использовать как локальную переменную в методе ActionPerformed


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


Если массив сделать локальной переменной, то вse ок, тольko перформанс пострадаеt немногo.


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

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


Опытный
**


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

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



Примерно вот так
Код


  public void actionPerformed(ActionEvent ae)
    {
      if (ae.getSource().equals(timer))
        {
           ThreadGroup currentGroup = Thread.currentThread().getThreadGroup();
       int i = currentGroup.activeCount();
       Thread[] activeThreadArray = new Thread[i];
       Thread.enumerate(activeThreadArray);
          for (int j = 0; j< i; j++)
            {
              if (activeThreadArray[j].getName().equalsIgnoreCase("ftp33")||
                  activeThreadArray
...


Ух ты, как вы быстро реагируете smile


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


Опытный
**


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

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



Вообще-то я "затачивался" на неиспользование ссылок в листе smile

Чтобы перформансе не пострадал (за счет создания каждый раз нового массива) можно его (массив) чистить на выходе из ActionPerformed, присваивая null всем 200 элементам (на всякий случай). Но будет ли это быстрее?

Цитата
еслi тред завершается в 10:52:33 а ты делаешь enumerate в 10:52:56

то завершившийся в 10:52:33 тред в enumerate не попадет

Цитата
кak ты вытянешь информацию с уже завершенного треда?


И такая задача стоит??? Имя тред за собой чистит по завершении и исчезает БЕССЛЕДНО. И кто с него не успел вытянуть информацию - тот опоздал smile В данном случае ftp33 и ftp54 - это, по завершении их тредов, уже мертвые имена, которые я взял чисто для иллюстрации. На самом деле список актуальных имен должен браться из листа





--------------------
Хотите поговорить об этом?
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.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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