На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> Массив Потоков
    ExpandedWrap disabled
      public class Synch {
       
          class NewThread implements Runnable{
              Thread t;
                  NewThread(){
                      t = new Thread();
                      t.start();
                  }
              public void run() {
                  
                  try{
                              int i = 0;
                              System.out.println("Я поток номер  " + i);
                              i++;
                      
                      
                      Thread.sleep(1000);
                      
                  }   catch (InterruptedException e){
                      System.out.println("поток  прерван");
                  
              }
              
              
              
          
       
       
          }  
          }
       
       
      public static void main(String args[]){
          int n=Integer.decode(args[0]);
          int y;
          NewThread[] Th = new NewThread[n];
          for(y=0; y<n;){
              Th[y].run();
              y++;
          }
      }
      }
    Сообщение отредактировано: Nort0n -
      Интересует вот что - возможна ли инициализация массива потоков, и как её следует производить. потому что ясно, что
      ExpandedWrap disabled
        NewThread[] Th = new NewThread[n];

      работает некорректно.
        Некорректно, это в смысле сваливается с NPE? Логично, ибо ты этой конструкцией только сам массив инициализируешь. А элементы кто делать будет?

        ExpandedWrap disabled
          public static void main(String args[]){
              int n=Integer.decode(args[0]);
              int y;
              NewThread[] Th = new NewThread[n];
              for(y=0; y<n;){
                  Th[y] = new NewThread();
                  Th[y].run();
                  y++;
              }
          }


        Это раз. Только вот содержимое класса NewThread это порнография в чистом виде. Переписывать его не буду, ибо не могу уловить суть того, что должно происходить. Но конструктор, имхо, надо отчистить в любом случае.
        Сообщение отредактировано: DUKe -
          Смею предположить, что автор мечтал увидеть нечто вроде этого(исправлял тупо чтоб работало, изначальный авторский стиль :D сохранен):
          ExpandedWrap disabled
            public class Synch {
             
                static class NewThread implements Runnable{
                    Thread t;
                    int i;
                        NewThread(int i){
                            this.i = i;
                            t = new Thread(this);
                            t.start();
                        }
                    public void run() {
             
                        try{
            //                        int i = 0;
                                    System.out.println("Я поток номер  " + i);
            //                        i++;
             
             
                            Thread.sleep(1000);
             
                        }   catch (InterruptedException e){
                            System.out.println("поток  прерван");
             
                    }
             
             
             
             
             
             
                }
                }
             
             
            public static void main(String args[]){
                int n=Integer.decode(args[0]);
                int y;
                NewThread[] Th = new NewThread[n];
                for (int i = 0 ; i < n ;i++) {
                    Th[i] = new NewThread(i);
                }
            //    for(y=0; y<n;){
            //        Th[y].run();
            //        y++;
            //    }
            }
            }


          Добавлено
          Да, Nort0n, расскажи нам скорей, че ты хотел изобразит то?
            НУ я хочу чтобы у меня создавалось, цитирую:



            Есть N>2 потоков , каждый из которых выводит свое имя M>2 раз.
            Нужно так синхронизовать потоки, чтобы имена выводились поочередно- в каскадном порядке.
            (имя1 имя 2 имя 3 имя 4 имя 5 ….
            имя 1 имя 2 имя 3 имя 4 имя 5 ….


            но синхронизацию я решил пока что отложить и разобраться с массивом.
              ExpandedWrap disabled
                public class Synch {
                    
                        static class NewThread implements Runnable{
                        Thread t;
                        int i;
                            NewThread(){      
                                t = new Thread(this);
                                t.start();
                            }
                        synchronized public void run(){
                            int i = 0;
                            for (i=0; i<5; i++){
                              System.out.print("Я поток номер:" + i+ "  ");
                              try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                              e.printStackTrace();
                            }
                            }
                            System.out.println();
                    }
                    }
                    public static void main(String args[]) throws InterruptedException{
                        int n=Integer.decode(args[0]);
                        int y;
                        NewThread[] Th = new NewThread[n];
                        for(y=0; y<n;){
                            Th[y] = new NewThread();
                          
                            Thread.sleep(1000);  
                            Th[y].run();                            
                            Thread.sleep(1000);
                            y++;
                        }
                    }
                }
                [censored]


                ЗЫ: Кстати, решение выложил из чистого эгоизма - решил вспомнить работу с потоками, а то, что-то давно этим не занимался, если у кого(обращаюсь в основном к модераторам и Дюку) время будет - гляньте, можно ли это оптимальнее сделать :)
                Сообщение отредактировано: wind -
                  Konigsberg, вроде, все прилично. Хотя я тоже давно уже многопоточностью не баловался.

                  Как вариант модификации, можно сделать очередь, в которую сложить все потоки, и нотифицировать, только следующего в очереди, а себя добавлять в конец. Я правда не уверен, что это будет производительнее :)
                    Цитата DUKe @
                    Как вариант модификации, можно сделать очередь, в которую сложить все потоки, и нотифицировать, только следующего в очереди, а себя добавлять в конец. Я правда не уверен, что это будет производительнее

                    и как нотифицировать определенный поток? :blink:
                      Konigsberg, вот такой вот порнографией:
                      ExpandedWrap disabled
                        ...
                        while (blocked) {}
                        blocked = true;
                        ...
                         
                         
                        setBlocked(boolean blocked) {
                            blocked = false;
                        }


                      Добавлено
                      Хотя, чего-то я не подумал, потоки ж все время активными будут. Не нафиг такое решение
                        Цитата DUKe @
                        Хотя, чего-то я не подумал, потоки ж все время активными будут. Не нафиг такое решение

                        :lool:
                          Konigsberg, знал, что после таких вечерних развлечений думать вредно... Чего-то я с ужасом понял, что я уже три часа статью пишу. Представляю, что я там написал... Надо утром перечитать. Вообщем заканчивая оффтоп: нормальное ты решение предложил.
                            Ок, сенкс, спать ложись :) Хотелось бы, что бы ещё wind глянул :)

                              Короче, констатирую факт: то, что ты изобразил со второй попытки - не пойдёт


                              Почему? (Закрывая глаза на то, что код корявый, ужасный etc.). ПОтоки синхронизированы (?), всё работает (?)
                                Цитата Nort0n @
                                ПОтоки синхронизированы (?), всё работает (?)

                                нет, нет :)
                                Твой "код" вообще мало чего делает из того, что должен :) Там даже потоков не то количество создается, что нужно, а уж то, что каждый поток тупо 5 раз выводит "я поток номер: 1, я поток номер 2,..." - ты сам то понимаешь что это бред? Зачем каждому потоку 5 раз писать что он поток номер 1-5? Тебе нужно, чтобы запускались все потоки, потом первый входил в цикл и выполнял первую итерацию, а все остальные ждали свою очередь, потом это делал второй поток, третий... Потом первый принимался за вторую, затем второй, третий... Это всё реализуется методами wait() и notifyAll() на общем для всех потоков мониторе. Советую тебе почитать про эти методы - они очень полезные :yes: И ещё - всё должно работать без подгонок с помощью sleep();
                                  Цитата Konigsberg @
                                  Хотелось бы, что бы ещё wind глянул :)

                                  Konigsberg, я бы инкапсулировал блокировку в классе, аналогичном вашему Monitor:

                                  ExpandedWrap disabled
                                    class PassThruLock {
                                        
                                        int counter = 0, maximum;
                                        
                                        public PassThruLock(int maximum) {
                                            this.maximum = maximum;
                                        }
                                        
                                        public synchronized void tryPass(int number) throws InterruptedException {
                                            while (number != counter) {
                                                wait();
                                            }
                                        }
                                        
                                        public synchronized void passed() {
                                            counter = (counter + 1) % maximum;
                                            notifyAll();
                                        }
                                        
                                    }
                                    А, ну это понятно, я в принципе не особо задумывался на счет "проектирования" этого кода... Меня просто всё смущает мой прием с notifyAll() и циклом while() - как то мне не очень нравится, но придумать лучше не смог :(
                                      Цитата Konigsberg @
                                      Меня просто всё смущает мой прием с notifyAll() и циклом while() - как то мне не очень нравится, но придумать лучше не смог :(

                                      Да нет, для примера нормально. Но лучше не использовать голые wait()/notify(), а обернуть их в классы вроде моего, иначе есть шанс помучиться уже с их синхронизацией (всё равно нужен флаг). А ещё лучше - использовать имеющиеся в пакете java.util.concurrent :)
                                      Сообщение отредактировано: wind -
                                        Цитата

                                        "я поток номер: 1, я поток номер 2,..." - ты сам то понимаешь что это бред?


                                        теперь понимаю, спасибо.

                                        Цитата

                                        И ещё - всё должно работать без подгонок с помощью sleep()


                                        я не знал. Спасибо за помощь
                                          Цитата wind @
                                          А ещё лучше - использовать имеющиеся в пакете java.util.concurrent

                                          Ну это если 5ку юзать, в 4-ке то их не было :)

                                          Цитата Nort0n @
                                          я не знал. Спасибо за помощь

                                          Не за что, лучше прочти про wait и notify :)
                                            Цитата Konigsberg @
                                            Ну это если 5ку юзать, в 4-ке то их не было :)

                                            У автора этих классов есть пакет и для java 1.4 - util.concurrent. Он хоть устроен немного иначе, но предоставляет тот же функционал.
                                              wind, сенкс :)

                                              Сообщения были разделены в тему "spam"
                                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                              0 пользователей:


                                              Рейтинг@Mail.ru
                                              [ Script execution time: 0,0562 ]   [ 15 queries used ]   [ Generated: 3.05.24, 00:04 GMT ]