Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Управление потоками в Java  (Прочитано 3649 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yarikx

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Управление потоками в Java
« : 28 Январь 2009, 22:51:24 »
Дело такое: Я в вузе буду изучать жабу, сейчас как раз самостоятельно разбираюсь (по книге). Дошол до раздела Многопоточное програмирование, начал делать всякие програмки, чтоб научится. И делая пример на управления приоритетами:задал потокам разные приоритеты и т.д. При выполнении обнаружил что все созданые потоки выполняются приблизительно с одинаковой скоростю (счетчики обеих былы очень близки). Думал гдето опять в исходниках ошибся - но проверив под вендой обнаружил, что там работает как надо (цифри счетчиков значительно отличаются).
Вопрос: что я делаю не так?

Оффлайн Saha

  • Активист
  • *
  • Сообщений: 517
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #1 : 28 Январь 2009, 22:52:55 »
а что значит - разные приоритеты? (в смысле, насколько)
в винде и линухе разные методы реализации многозадачности/многопоточности, если я не ошибаюсь

Оффлайн Yarikx

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #2 : 28 Январь 2009, 23:12:05 »
Разные приоритеты - в смысле функцией setPriority(int p) выделение разного процесорного воемени на разные потоки.
Если разные методы реализации многозадачности/многопоточности, то как мне это зделать в линуксе? (ибо интересно, а в книге нету(( )

Оффлайн Saha

  • Активист
  • *
  • Сообщений: 517
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #3 : 28 Январь 2009, 23:14:05 »
и какие значения ты задаешь?

Оффлайн Yarikx

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #4 : 28 Январь 2009, 23:22:59 »
разные. сперва задавал 7 и 3, потом 9 и 2 потом 10 и 1 - результат почти одинаков

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #5 : 28 Январь 2009, 23:29:40 »
Разные оси реализовывают управление потоками по разному. Так же, в книге должно быть написано, что на приоритеты потоков нельзя полагаться, т.к. они могут игнорироваться операционной системой.
ArchLinux x86_64

Оффлайн leanid.chaika

  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #6 : 28 Январь 2009, 23:33:17 »
Давай сюда код... и все узнаем... я правда год как на яве не писал, но думаю хоть разомнусь...
И кстати у явы своя работа с потоками, которая может совсем не одинаково работать на разных платформах...
Причем многозадачность в линуксе и форточках реализована по-разному! (как в висте не в курсе) поэтому разные результаты это может быть именно то что надо.
Короче давай код! И скажи под какой версией виртуальной машины проверяешь?

Оффлайн Yarikx

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #7 : 28 Январь 2009, 23:39:43 »
class Thr implements Runnable {
   Thread t;
   public long clicks = 0;
   private volatile boolean runnin = true;
   public Thr(int p){
      t = new Thread(this);
      t.setPriority(p);
   }
   public void run(){
      while(runnin){
         clicks++;
      }
   }
   public void stop(){
      runnin = false;
   }
   public void start(){
      t.start();
   }
}
class ThrTest {
   public static void main(String[] args){
      Thr hi = new Thr(9);
      Thr lo = new Thr(2);
      
      hi.start();
      lo.start();
      
      try{
         Thread.sleep(10000);
      }catch(InterruptedException e){
         System.out.println("перервано головний потік");
      }
      hi.stop();
      lo.stop();
      try{
         hi.t.join();
         lo.t.join();
      }catch(InterruptedException e){
         System.out.println("перервано інший потік");
      }
      System.out.println("hi  " + hi.clicks);
      System.out.println("lo  " + lo.clicks);
      
   }
}

Вывод програмы:
hi  5584582
lo  5017186
хотя под вендой цыфру отличаются на порядки
« Последнее редактирование: 28 Январь 2009, 23:43:06 от Yarikx »

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #8 : 29 Январь 2009, 00:45:17 »
Как я уже говорил - приоритеты носят лишь рекомендательный характер. Нет смысла полагаться на них.
Вместо кода было бы полезнее посмотреть документацию.
ArchLinux x86_64

Оффлайн leanid.chaika

  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #9 : 29 Январь 2009, 00:52:56 »

//Документация это да... Но только ее читаешь и ничего не чувствуешь... а тут бери и запускай!!! И наглядно посмотришь что сколько и когда //переключалось... просто и понятно...

class Thr implements Runnable {
   Thread t;

   public long clicks = 0;

   private volatile boolean runnin = true;
   private String label;

   public Thr(int p, String label) {
      t = new Thread(this);
      t.setPriority(p);
      this.label = label;
   }

   public void run() {
      while (runnin) {
         System.out.print(label);
         clicks++;
         Thread.yield();
      }
   }

   public void stop() {
      runnin = false;
   }

   public void start() {
      t.start();
   }
}

class ThrTest {
   public static void main(String[] args) {
      Thr hi = new Thr(Thread.MAX_PRIORITY, "h");
      Thr lo = new Thr(Thread.MIN_PRIORITY, "l");

      hi.start();
      lo.start();

      try {
         Thread.sleep(100);
      } catch (InterruptedException e) {
         System.out.println("перервано головний потік");
      }
      hi.stop();
      lo.stop();

      try {
         hi.t.join();
      } catch (InterruptedException e) {
         System.out.println("перервано інший потік");
      }
      try {
         lo.t.join();
      } catch (InterruptedException e) {
         System.out.println("перервано інший потік");
      }
      System.out.println("\nhi  " + hi.clicks);
      System.out.println("lo  " + lo.clicks);

   }
}

Я слегка поменял... чисто для тебя, для наглядности... это должно и под винодой давай приблизительно такие же результаты. позапускай ее несколько раз подряд и посмотри на результаты! Иногда они удивляют... но это только в первый раз... и у меня двухъядерный процессор... но думаю что это не сильно скажется. Вообще по хорошему в многопоточном приложении нельзя полагаться вообще ни на что... т.е. гарантий нет! :)

Вообще ява мой любимый язык... приятно вспомнить... :)
« Последнее редактирование: 29 Январь 2009, 01:03:48 от leanid.chaika »

Оффлайн Yarikx

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #10 : 29 Январь 2009, 02:10:53 »
Спасибо. Я так понял что надо было еще какую нибуть нагрузку на процесор - в даном случае выводить на екран "букафки"
« Последнее редактирование: 29 Январь 2009, 02:25:20 от Yarikx »

Оффлайн leanid.chaika

  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #11 : 29 Январь 2009, 02:35:39 »
Да, но! еще добавлен вызов Thread.yield() для того что бы после каждого действия текучий поток говорил операционке, что он свободен и она может его заменить другим. И наче операционка должна вытеснять его т.к. он никогда не скажет что он освободился... т.е. операционке не нужно напрягаться в вычислениях следующего кто станет на место текущего потока... и поэтому результаты слегка правдивее должны быть в разных осях...
но все равно ты заметил, что результат прыгает... и иногда даже у меня поток с меньшим приоритетом выполнялся большее количество раз. И за счет "буковок" можно посмотреть как именно проходило переключение. что чаще выполнялось...

Оффлайн zera

  • Любитель
  • *
  • Сообщений: 69
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #12 : 29 Январь 2009, 10:10:23 »
-XX:+UseThreadPriorities?
а точнее даже  -XX:+UseThreadPriorities  -XX:ThreadPriorityPolicy=1
hi  1082
lo  94
« Последнее редактирование: 29 Январь 2009, 10:12:24 от zera »

Оффлайн Yarikx

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #13 : 29 Январь 2009, 14:19:00 »
Но разве Thread.yield() не должна уступать только потокам такого же приоритета?

Оффлайн zera

  • Любитель
  • *
  • Сообщений: 69
    • Просмотр профиля
Re: Управление потоками в Java
« Ответ #14 : 29 Январь 2009, 15:45:50 »
Yarikx, с чего вдруг?
Цитировать
Thread.yield()
Causes the currently executing thread object to temporarily pause and allow other threads to execute.

 

Страница сгенерирована за 0.063 секунд. Запросов: 24.