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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, некоторая непонятка 
V
    Опции темы
soulcub
Дата 9.7.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

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



Нашёл, как по мне, неплохой пример по приоритетам потоков.

Код

public class ThreadTest implements Runnable {

    public void run() {
        double calc;
        for (int i = 0; i < 50000; i++) {
            calc = Math.sin(i * i);
            if (i % 10000 == 0) {
                System.out.println(getName()
                        + " counts " + i / 10000);
            }
        }
    }

    public String getName() {
        return Thread.currentThread().getName();
    }

    public static void main(String s[]) {
        // Подготовка потоков
        Thread t[] = new Thread[3];
        for (int i = 0; i < t.length; i++) {
            t[i] = new Thread(new ThreadTest(),
                    "Thread " + i);
        }
        // Запуск потоков
        for (int i = 0; i < t.length; i++) {
            t[i].start();
            System.out.println(t[i].getName()
                    + " started");
        }
    }
}


и в том же примере написано, что в данном случае, без приоритетов потоки запускаются по-очереди и выполняются так же. 
То-есть на экране мы увидим нечто такое:

Thread 0 started
Thread 1 started
Thread 2 started
Thread 0 counts 0
Thread 1 counts 0
Thread 2 counts 0
Thread 0 counts 1
Thread 1 counts 1
Thread 2 counts 1
Thread 0 counts 2
Thread 2 counts 2
Thread 1 counts 2
Thread 2 counts 3
Thread 0 counts 3
Thread 1 counts 3
Thread 2 counts 4
Thread 0 counts 4
Thread 1 counts 4 

По логике так и должно происходить, но у меня получается некий непонятный бред, который не поддаётся моей логике..
Выводит:

Thread 0 started
Thread 1 started
Thread 2 started
Thread 1 counts 0
Thread 1 counts 1
Thread 1 counts 2
Thread 0 counts 0
Thread 1 counts 3
Thread 0 counts 1
Thread 1 counts 4
Thread 0 counts 2
Thread 0 counts 3
Thread 2 counts 0
Thread 2 counts 1
Thread 0 counts 4
Thread 2 counts 2
Thread 2 counts 3
Thread 2 counts 4

в другой раз такое:

Thread 0 started
Thread 0 counts 0
Thread 1 started
Thread 2 started
Thread 1 counts 0
Thread 2 counts 0
Thread 0 counts 1
Thread 2 counts 1
Thread 0 counts 2
Thread 2 counts 2
Thread 0 counts 3
Thread 2 counts 3
Thread 0 counts 4
Thread 2 counts 4
Thread 1 counts 1
Thread 1 counts 2
Thread 1 counts 3
Thread 1 counts 4

Не могу понять в чём прикол. Есть догадка, что это связано с тем, что у меня проц двухядерный. 
Но почему оно действует именно так? Спасибо заранее.
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
AbdulBcex
Дата 9.7.2010, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вообще по логике потокам присваиватся приоритет потока их породившего. То есть в этом примере у всех потоков приоритет один и одинаков, следовательно распределение ресурсов может происходить каждый раз совершенно по разному и могут быть разные результаты. 
Цитата

и в том же примере написано, что в данном случае, без приоритетов потоки запускаются по-очереди и выполняются так же. 

Кстати, в книгах обычно наоборот пишут, что результаты различаться могут.

Это сообщение отредактировал(а) AbdulBcex - 9.7.2010, 12:23
PM MAIL   Вверх
soulcub
Дата 9.7.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

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



Ну ок, логика есть. Но если делаю приоритетом(немного поменяю мейн)

Код

    public static void main(String s[]) {
        // Подготовка потоков
        Thread t[] = new Thread[3];
        for (int i = 0; i < t.length; i++) {
            t[i] = new Thread(new ThreadTest(),
                    "Thread " + i);
        }
        t[0].setPriority(Thread.MIN_PRIORITY);
        t[1].setPriority(Thread.NORM_PRIORITY);
        t[2].setPriority(Thread.MAX_PRIORITY);
        // Запуск потоков
        for (int i = 0; i < t.length; i++) {
            t[i].start();
            System.out.println(t[i].getName()
                    + " started");
        }
    }


тут же должно быть отчётливое доминирование 2-го над 1-м, и их обоих над 0-м, верно?

А выводит:

Thread 0 started
Thread 0 counts 0
Thread 1 started
Thread 2 started
Thread 2 counts 0
Thread 1 counts 0
Thread 2 counts 1
Thread 1 counts 1
Thread 1 counts 2
Thread 2 counts 2
Thread 1 counts 3
Thread 2 counts 3
Thread 1 counts 4
Thread 2 counts 4
Thread 0 counts 1
Thread 0 counts 2
Thread 0 counts 3
Thread 0 counts 4

Окей, видно что 0-й поток в аутсайдерах, как и должно быть, но ведь 2-й поток должен быть на много приоритетнее чем 1-й, 
а они как на равных.. 1-й даже на 2-й итерации начал обгонять 2-1.  С таким раскладом приоритетность вообще теряет свой смысл.. Может я что-то не так делаю?
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
jk1
Дата 9.7.2010, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Дело в том, что выставление приоритетов само по себе ничего не гарантирует
Цитата

Rule of thumb: At any given time, the highest priority thread is running. However, this is not guaranteed. The thread scheduler may choose to run a lower priority thread to avoid starvation. For this reason, use priority only to affect scheduling policy for efficiency purposes. Do not rely on thread priority for algorithm correctness.

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



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
lazycat
Дата 9.7.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(soulcub @  9.7.2010,  13:08 Найти цитируемый пост)
тут же должно быть отчётливое доминирование 2-го над 1-м, и их обоих над 0-м, верно?

Не факт.  Это зависит от множества причин, в частности от используемой операционной системы. Дело в том, что для поддержки потоков JVM напрямую использует соответствующие средства ОСю
Например, в Java определено 10 приоритетов для потоков, а в Windows - только 7. В результате 10 приоритетов отображаются в 7.
Более того, в какой-то из версий Linux (не помно в какой) приоритеты вообще не поддерживаются. Результат не трудно предсказать, не так ли?
Одним словом, приоритеты - это только "благие намерения". Полагаться на них - это значит создавать все условия для самых мерзких ошибок - тех, которые проявляются лишь изредка и надолго исчезают.
Если Вам важен порядок запуска потоков, используйте средства синхронизации,  семафоры, барьеры, если они не позволяют сделать то, что Вам надо, устанавливайте и проверяйте флаги самостоятельно.

PM MAIL   Вверх
soulcub
Дата 9.7.2010, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

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



Та почему-то на собеседовании на работу очень спрашивали именно про приоритетность потоков) Может про то, что не следует на них полагаться он ии хотели услышать, ну да ладно) Спасибо большое за ответы, совершенствуем знания =)

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

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

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


 




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


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

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