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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопточность на Яве 
:(
    Опции темы
Syltan
Дата 19.6.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Напишите пожалуйста пример, реализация многопточности через интерфейс и Рунабле и через наследование от класа Зрид. Самый простой пример по тому и по тому. Заранее благодарю.
PM MAIL   Вверх
powerOn
Дата 19.6.2010, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Тут посмотри. Первые два примера.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Syltan
Дата 20.6.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

package uu;
class MyThread extends Thread {
  int count;
   MyThread() {
    count = 0;
  }

  public void run() {
    System.out.println("MyThread starting.");
    try {
      do {
        Thread.sleep(500);
        System.out.println("In MyThread, count is " + count);
        count++;
      } while (count < 5);
    } catch (InterruptedException exc) {
      System.out.println("MyThread interrupted.");
    }
    System.out.println("MyThread terminating.");
  }
}

public class Main {
  public static void main(String args[]) {
    System.out.println("Main thread starting.");
    MyThread mt = new MyThread();
    mt.start();
    do {
      System.out.println("In main thread.");
      try {
        Thread.sleep(250);
      } catch (InterruptedException exc) {
        System.out.println("Main thread interrupted.");
      }
    } while (mt.count != 5);
    System.out.println("Main thread ending.");
  }
}


1)Скажите пожалуйта, зачем нужно исключение InterruptedException
2) 
Код
MyThread mt = new MyThread(); //Это создание объекта  mt класса MyThread 
    mt.start();  //Это запуск метода run

В методе Run описывается сам поток, который будет выполнятся? Именно после строки
Код
mt.start();


мы запускаем сам поток?
3)Каким методом происходит завершение потока или для этого не нужен метод?
PM MAIL   Вверх
powerOn
Дата 20.6.2010, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(Syltan @  20.6.2010,  14:48 Найти цитируемый пост)
1)Скажите пожалуйта, зачем нужно исключение InterruptedException

Этого требует сигнатура метода Thread.sleep(). Нам необходимо обработать это исключение.

Цитата(Syltan @  20.6.2010,  14:48 Найти цитируемый пост)
В методе Run описывается сам поток, который будет выполнятся?

Да, можно переопределить этот метод и при старте он будет выполнен в отдельном потоке.

Цитата(Syltan @  20.6.2010,  14:48 Найти цитируемый пост)
3)Каким методом происходит завершение потока или для этого не нужен метод? 

Естественным. Т.е. как только будет сделан return из метода run. Конечно, можно завершить поток вызовом метода interrupt(), но это не желательная практика.


--------------------
user posted image нет времени думать - нужно писать КОД!

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


Опытный
**


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

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



Пробую делать исключение деление на ноль, исключение делаю своё отдкльное и оно не срабатывает.
Код

package uu;
class MyThread extends Thread {
  int count;
   MyThread() {
    count = 0;
  }

  public void run() {
    System.out.println("Запуск потока");
    try {
      do {
        Thread.sleep(500);
        System.out.println("Процес № " + count);
        count++;
      } while (count < 5);
    } catch (InterruptedException exc) {
      System.out.println("Процес прерван.");
    }
  System.out.println("Процес заершился.");
  }
}


 class pinokio extends Thread {
     int k;
     int rez;
     
     pinokio(){
     k = 0;
     }
     public void run() throws rtr{
         try{
         Thread.sleep(500);
         try{
         int d = 5/0;
         System.out.println(d);
         throw new rtr("Ошибка!Деление на ноль!");
         }catch(rtr w){
              System.out.println(w.getMessage());
         }
         }catch(InterruptedException e){
         System.out.println("Исключение слип сработало!");
         }
     }
 }

public class Main {
  public static void main(String args[]) {
    System.out.println("Main thread starting.");
    MyThread mt = new MyThread();
    //После вызова метода start() начинаеться выполняться метод run()
    mt.start();
    do {
      System.out.println("В главной функции Main");
      try {
        Thread.sleep(250);
      } catch (InterruptedException exc) {
        System.out.println("Прервание главного потока Main");
      }
    } while (mt.count != 5);

   pinokio obj = new pinokio();
   obj.start();
  }
}


Код

package uu;
public class rtr extends Exception {
public rtr(){
    super();
}
public rtr(String str){
    super(str);
}

}



Это сообщение отредактировал(а) Syltan - 20.6.2010, 15:42
PM MAIL   Вверх
powerOn
Дата 20.6.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(Syltan @  20.6.2010,  16:38 Найти цитируемый пост)
Пробую делать исключение деление на ноль, исключение делаю своё отдкльное и оно не срабатывает.


Ну а как оно должно сработать, если у тебя в строке 35:
Цитата

int d = 5/0;

явно будет выброшено ArithmeticException, и соответственно, до 37 строки выполнение никогда не дойдет.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Syltan
Дата 21.6.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Прокоментируйте пожалуйста вот эти 2 строчки.
Код

MyThread2 obj2 = new MyThread2(); //Это создание объекта 
    Thread newThrd = new Thread(obj2); //А здесь зачем вновь создавать объект?




В этом месте кода
System.out.println("Main thread starting.");
    MyThread2 obj2 = new MyThread2();
    Thread newThrd = new Thread(obj2);
    newThrd.start();
    do {
      System.out.println("In main thread.");
      try {
        Thread.sleep(250);
      } catch (InterruptedException exc) {
        System.out.println("Main thread interrupted.");
      }
    } while (obj2.count != 5);
  }
}

Зачем снова описывается цикл ,если он описывался в функции Run() ?  



Код

package u;
    class MyThread extends Thread {
        int index;
        MyThread(int threadIndex) {
            index = threadIndex;
        }

        public void run() {
            for (int i = 0; i < 150; i++) {
                for (int j = 0; j < 100000000; j++);
                System.out.println("Thread # " + index + "; round - " + i);
            }
        }
}



class MyThread1 extends Thread {
  int count;
   MyThread1() {
    count = 0;
  }

 //выполняеться 2 потока поток метода main и MyThread
  public void run() {
    System.out.println("Запуск потока от класса Thread");
    try {
      do {
        Thread.sleep(500);
        System.out.println("Процес № " + count);
        count++;
      } while (count < 5);
    } catch (InterruptedException exc) {
      System.out.println("Процес прерван.");
    }
  System.out.println("Процес заершился.");
  }
}

//Наследование от интерфейса
class MyThread2 implements Runnable {
  int count;

  MyThread2() {
    count = 0;
  }
  public void run() {
    System.out.println("Запуск потока от интерфейса Runable.");
    try {
      do {
        Thread.sleep(500);
        System.out.println("Процес №" + count);
        count++;
      } while (count < 5);
    } catch (InterruptedException exc) {
      System.out.println("Процес прерван.");
    }
    System.out.println("Процес заершился.");
  }
}

public class Main {
  public static void main(String args[]) {

    //Реализация через интерфейс
    System.out.println("Main thread starting.");
    MyThread1 obj1 = new MyThread1();
    //После вызова метода start() начинаеться выполняться метод run()
    obj1.start();
    do {
      System.out.println("В главной функции Main");
      try {
        Thread.sleep(250);
      } catch (InterruptedException exc) {
        System.out.println("Прервание главного потока Main");
      }
    } while (obj1.count != 5);

//______________________________________________________________________

System.out.println("Main thread starting.");
    MyThread2 obj2 = new MyThread2();
    Thread newThrd = new Thread(obj2);
    newThrd.start();
    do {
      System.out.println("In main thread.");
      try {
        Thread.sleep(250);
      } catch (InterruptedException exc) {
        System.out.println("Main thread interrupted.");
      }
    } while (obj2.count != 5);
  }
}

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


Опытный
**


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

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



Цитата(Syltan @  21.6.2010,  13:56 Найти цитируемый пост)
Прокоментируйте пожалуйста вот эти 2 строчки.

Затем, что обычно поток запускается так:
Код

Object something = new MyClass(); //MyClass реализует интерфейс Runnable
Thread thread = new Thread(something); //создание потока, который будет запускать нащ раннейбл
thread.start(); //запуск

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


Опытный
**


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

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



Зачем нужно снова описывать цикл только уже в функции Меин, если мы этот цикл  описали в функциии Run() которая работает с потоком.
Снова идёт цикл зачем?
Код

System.out.println("Main thread starting.");
    MyThread2 obj2 = new MyThread2();
    Thread newThrd = new Thread(obj2);
    newThrd.start();
    do {
      System.out.println("In main thread.");
      try {
        Thread.sleep(250);
      } catch (InterruptedException exc) {
        System.out.println("Main thread interrupted.");
      }
    } while (obj2.count != 5);
  }
}
 

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


Опытный
**


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

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



Полагаю затем, что этот код написан для примера, и бизнес-логики не содержит.
PM   Вверх
Syltan
Дата 21.6.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хорошо, а что даёт этот второй цикл в функции Меин тогда?
PM MAIL   Вверх
MaxPayneC
Дата 21.6.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Поток main раз в 250 мс проверяет, не достигнуто ли 5 в переменной раннейбла, и если нет, уходит в сон. Эта переменная увеличивается раз в полсекунды в методе run() потока, создаваемого из Runnable MyThread2 и запускаемого объектом newThrd.
PM   Вверх
Syltan
Дата 21.6.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот немного модернизировал код, подкскажите пожалуйста,  как доделать его чтоб один поток взаимодействовал с другим потоком.

Код

package u;
class MyThread1 extends Thread {
  int count1=50;
  int count2=100;
 //выполняеться 2 потока поток метода main и MyThread
  public void run() {
    System.out.println("Запуск потока от класса Thread");
    try {
        int i=10;
        int j=0;
        do {
            System.out.println( "Процес № "+i +"  Процес № " +j);
            i++;
            j++;
            Thread.sleep(250);
        } while ( (i<count1) && (j<count2) );
       
    } catch (InterruptedException exc) {
      System.out.println("Процес прерван.");
    }
  System.out.println("Процес заершился.");
  }
}


//Наследование от интерфейса
class MyThread2 implements Runnable {
  int count;

  MyThread2() {
    count = 0;
  }
  public void run() {
    System.out.println("Запуск потока от интерфейса Runable.");
    try {
      do {
        Thread.sleep(500);
        System.out.println("Процес №" + count);
        count++;
      } while (count < 5);
    } catch (InterruptedException exc) {
      System.out.println("Процес прерван.");
    }
    System.out.println("Процес заершился.");
  }
}

public class Main {
  public static void main(String args[]) {
    //Реализация через интерфейс
    System.out.println("Main thread starting.");
    MyThread1 obj1 = new MyThread1();
    //После вызова метода start() начинаеться выполняться метод run()
    Thread obj11 = new Thread();
    obj1.start();

  


//_____________________________________________________________________
/*MyThread2 объект класса, реализующего интерфейс Runnable.
  Объекты таких классов не являются потоками в чистом виде. Создать поток, использую
  данный объект можно только через конструктор класса Thread - Thread(r Runnable)
 (здесь r = obj2).
*/
   //MyThread2 реализует интерфейс Runnable
    MyThread2 obj2 = new MyThread2();
    //создание потока, который будет запускать нащ раннейбл
    Thread obj22 = new Thread(obj2);
    obj22.start();
   }
}





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.0969 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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