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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность java, Работа потоков 
V
    Опции темы
kinderrrr
Дата 25.8.2013, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. Я в java новичёк. По многочисленным советам знакомых начал читать книгу Герберта Шилдта. Столкнулся с проблемой. Не могу понять работу потоков. Хотел немного модифицировать пример чтобы после 9 переключений дочерних потоков закончилась программа. Вопрос в следующем. Почему главный поток заканчивает свою работу так рано, а не в конце. Заранее спасибо за помощь. Если что не так в оформлении поправляйте.
Код


class Q {
  int n;
  boolean valueSet = false;

  synchronized int get() {
      System.out.println("Забрал   " + valueSet );
    while(!valueSet)
      try {
        wait();

      } catch(InterruptedException e) {
        System.out.println("Исключение перехвачено");
      }

      System.out.println("Забрал: " + n);
      valueSet = false;
      notify();
      
      return n;
     
  }
  
  

  synchronized void put(int n) {
      System.out.println("Положил   " + valueSet );
    while(valueSet)
      try {
        wait();
      } catch(InterruptedException e) {
        System.out.println("Исключение перехвачено");
      }

      this.n = n;
      valueSet = true;
      System.out.println("Положил: " + n);
      
      notify();
      
  }
}

class Producer implements Runnable {
  Q q;

  Producer(Q q) {
    this.q = q;
    new Thread(this, "Producer").start();
  }
  Thread qw1 = Thread.currentThread();
  public void run() 
        {
        
        int i = 0;
        boolean znach=true;
            while(znach) 
                {
     
                    q.put(i++);
                    if(i==10)
                        {
         
                            znach=false;
         
                        }
    
                }
        System.out.println("PPPPPPPPPPPPPPPPPPPP     " + qw1.isAlive());
        }
}

class Consumer implements Runnable 
{
  Q q;

  Consumer(Q q) 
  {
    this.q = q;
    new Thread(this, "Consumer").start();
  }
  Thread qw = Thread.currentThread();
 
  public void run() 
    {
      
      int per;
      boolean znach1=true;
        while(znach1) 
            {
          
                per = q.get();
                if (per==9)
                    {
                     znach1=false;    
                    }
     
            }    
        System.out.println("CCCCCCCCCCCCCCCCCCCC     " + qw.isAlive());
     
    }
}

class file {
  public static void main(String args[]) {
      
    Q q = new Q();
    new Producer(q);
    new Consumer(q);
    
 
   

    System.out.println("Главный поток закончил работу");
    
  }
  
}



PM MAIL   Вверх
Alexey91
Дата 25.8.2013, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



То есть вы хотите, чтобы сообщение "Главный поток закончил работу" было выведено после того, как завершили работу потоки Producer, Consumer?
Тогда делайте join.
PM   Вверх
kinderrrr
Дата 25.8.2013, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Alexey91 @ 25.8.2013,  15:09)
То есть вы хотите, чтобы сообщение "Главный поток закончил работу" было выведено после того, как завершили работу потоки Producer, Consumer?
Тогда делайте join.

Нужно в методах run() добавлять методы join()? Или в методе main()? Если в методе main() то не подскажете как обратиться в нём к дочерним потокам. Спасибо за отзывчивость
PM MAIL   Вверх
Alexey91
Дата 27.8.2013, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Будет примерно так:

Код




....

class Producer extends Thread
{
 ...
}

class Costumer extends Thread
{
 ...
}

public class Main
{
 ....


public static void main(String args[])
{
 Costumer c = new Costumer();
 Producer p = new Producer();

 c.start();
 p.start(); 

 c.join();
 p.join();
 
 System.out.println("Это сообщение появиться после завершения Costumer, Producer");

}


}


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


Новичок



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

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



Цитата(Alexey91 @ 27.8.2013,  15:32)
Будет примерно так:

Код




....

class Producer extends Thread
{
 ...
}

class Costumer extends Thread
{
 ...
}

public class Main
{
 ....


public static void main(String args[])
{
 Costumer c = new Costumer();
 Producer p = new Producer();

 c.start();
 p.start(); 

 c.join();
 p.join();
 
 System.out.println("Это сообщение появиться после завершения Costumer, Producer");

}


}


Спасибо большое тебе за помощь. вот конечный код

Код


class Q {
  int n;
  boolean valueSet = false;

  synchronized int get() {
      System.out.println("Забрал   " + valueSet );
    while(!valueSet)
      try {
        wait();

      } catch(InterruptedException e) {
        System.out.println("Исключение перехвачено");
      }

      System.out.println("Забрал: " + n);
      valueSet = false;
      notify();
      return n;
  }
  
  
  synchronized void put(int n) {
      System.out.println("Положил   " + valueSet );
      while(valueSet)
      try {
        wait();
      } catch(InterruptedException e) {
        System.out.println("Исключение перехвачено");
      }

      this.n = n;
      valueSet = true;
      System.out.println("Положил: " + n);
      
      notify();
      
  }
}

class Producer implements Runnable {
Q q;
Thread Pro;

  Producer(Q q) 
  {
    this.q = q;
   Pro =  new Thread(this, "Producer");
   Pro.start();
  }
  
  
  public void run() 
        {
        int i = 0;
        boolean znach=true;
        while(znach) 
                {
     
                    q.put(i++);
                    if(i==10)
                        {
                            znach=false;
                        }
                }
        }
}

class Consumer implements Runnable 
{
  Q q;
Thread Con;
  Consumer(Q q) 
  {
    this.q = q;
   Con = new Thread(this, "Consumer");
   Con.start();
  }
  
 
  public void run() 
    {
      int per;
      boolean znach1=true;
        while(znach1) 
            {
                per = q.get();
                if (per==9)
                    {
                     znach1=false;    
                    }    
            }    
    }
}

class file {
  public static void main(String args[]) {
    
 Q q = new Q();
 Producer prodobj =   new Producer(q);
 Consumer conobj =   new Consumer(q);
  
    try 
    {
        prodobj.Pro.join();
        conobj.Con.join();
    } catch (InterruptedException e) {System.out.println("perexva4eno");}
    
    System.out.println("Статус выполнения потока Producer     " + prodobj.Pro.isAlive());
    System.out.println("Статус выполнения потока Consumer     " + conobj.Con.isAlive());
    System.out.println("Главный поток закончил работу");
    
  }
  
}     



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

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

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


 




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


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

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