Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Многопточность на Яве


Автор: Syltan 19.6.2010, 17:13
Напишите пожалуйста пример, реализация многопточности через интерфейс и Рунабле и через наследование от класа Зрид. Самый простой пример по тому и по тому. Заранее благодарю.

Автор: powerOn 19.6.2010, 17:53
http://java2s.com/Code/Java/Threads/Simple-Threads.htm посмотри. Первые два примера.

Автор: Syltan 20.6.2010, 13:48
Код

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)Каким методом происходит завершение потока или для этого не нужен метод?

Автор: powerOn 20.6.2010, 13:58
Цитата(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(), но это не желательная практика.

Автор: Syltan 20.6.2010, 15:38
Пробую делать исключение деление на ноль, исключение делаю своё отдкльное и оно не срабатывает.
Код

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);
}

}


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


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

int d = 5/0;

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

Автор: Syltan 21.6.2010, 13:56
Прокоментируйте пожалуйста вот эти 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);
  }
}

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

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

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

Автор: Syltan 21.6.2010, 14:14
Зачем нужно снова описывать цикл только уже в функции Меин, если мы этот цикл  описали в функциии 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);
  }
}
 

Автор: MaxPayneC 21.6.2010, 14:17
Полагаю затем, что этот код написан для примера, и бизнес-логики не содержит.

Автор: Syltan 21.6.2010, 14:21
Хорошо, а что даёт этот второй цикл в функции Меин тогда?

Автор: MaxPayneC 21.6.2010, 14:29
Поток main раз в 250 мс проверяет, не достигнуто ли 5 в переменной раннейбла, и если нет, уходит в сон. Эта переменная увеличивается раз в полсекунды в методе run() потока, создаваемого из Runnable MyThread2 и запускаемого объектом newThrd.

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

Код

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();
   }
}





Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)