powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / как работают приоритеты в потоках
13 сообщений из 13, страница 1 из 1
как работают приоритеты в потоках
    #32966035
black zorro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кто мне объяснит как работают приоритеты потоков, потому что только что столкнулся с такой фишкой и не могу понять:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
class FirstTH extends Thread
{
	long c= 0 ;
	boolean running = true;
	FirstTH(String st)
	{
		super(st);
	}
	public void run()
	{
		while(running)
		{
			c ++ ;
			yield();
		}
	}
	public void stop1()
	{
		running =false;
	}
}

public class MainThreads {

	public static void main(String[] args) throws InterruptedException 
	{
		Thread mt = Thread.currentThread();
		
		FirstTH myht = new FirstTH("First");
		FirstTH myht1 = new FirstTH("Second");
		FirstTH myht2 = new FirstTH("Third");
		mt.setPriority(Thread.MAX_PRIORITY);
		myht.setPriority(Thread.MIN_PRIORITY);
		myht1.setPriority(Thread.NORM_PRIORITY);
		myht2.setPriority(Thread.MAX_PRIORITY);
		
		
		myht1.start();
		myht2.start();
		myht.start();

		Thread.sleep( 1000 );
		myht.stop1();
		myht1.stop1();
		myht2.stop1();
		System.out.println(myht.getName()+":"+myht.c);
		System.out.println(myht1.getName()+":"+myht1.c);
		System.out.println(myht2.getName()+":"+myht2.c);
		System.out.println(Thread.MAX_PRIORITY+" "+Thread.MIN_PRIORITY+" "+Thread.NORM_PRIORITY);

	}
}

после запуска получаются цифры:
для first - много миллионов
для second и third - 1, а без yield - вообще 0.
неужели за целую секунду два потока вообще не получили управления?
тот же результат когда делаю так:
Код: plaintext
1.
2.
3.
		myht.setPriority(Thread.NORM_PRIORITY -  2 );
		myht1.setPriority(Thread.NORM_PRIORITY -  1 );
		myht2.setPriority(Thread.MAX_PRIORITY);
если же всем потокам поставить один приоритет не важно какой то результаты примерно одинаковы. почему же в случае столь незначительного изменения проиритетов такая разбежка.
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966100
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем-то нормальное поведение. Кстати, под какой операционной системой запускаешь? В зависимости от используемой JVM работа потоков может сильно меняться.
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966164
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А главное от используемой OS. Так как существуют разные реализации многопоточности (чередование времени/пока не отдаст управление) и вразных OS разные диапазоны для возможных приоритетов.

Поэтому везде в официальных источниках рекомендуется делать все потоки с однинаковым приоритетом и если в потоке выполняются долгие вычисления, давать возможность OS переключиться на другие потоки (yeild, sleep(10) и т.п.). Иначе, на разных платформах можно получить разное поведение, например, поток с низким приоритетом никогда не получит управление, или исполняться будет только один поток (с куском кода типа "for(;;);" ).
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966196
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsА главное от используемой OS. Так как существуют разные реализации многопоточности (чередование времени/пока не отдаст управление) и вразных OS разные диапазоны для возможных приоритетов.

Поэтому везде в официальных источниках рекомендуется делать все потоки с однинаковым приоритетом и если в потоке выполняются долгие вычисления, давать возможность OS переключиться на другие потоки (yeild, sleep(10) и т.п.). Иначе, на разных платформах можно получить разное поведение, например, поток с низким приоритетом никогда не получит управление, или исполняться будет только один поток (с куском кода типа "for(;;);" ).
Реализация потоков в JVM все-таки важнее ИМХО. Поведение native threads и green threads отличается значительно сильнее, чем native threads в разных ОС.
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966577
вообще говоря, native thread's как раз и есть либо green, либо с чередованием по времени.

Везде пишут, что в линухе green, а в винде slicing, и что это существенно влияейт на исполнение потоков.

Или ты говоришь о JVM других производителей, не sun?
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966671
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю иначевообще говоря, native thread's как раз и есть либо green, либо с чередованием по времени.

Везде пишут, что в линухе green, а в винде slicing, и что это существенно влияейт на исполнение потоков.

Или ты говоришь о JVM других производителей, не sun?

Я книгу читал, там было написано, что зеленые потоки, это те, которые сама JVM реализует и что эта JVM под линух. Акцент был сделан на то, что это недоделка. Книга вроде 2003-2002 года и описывалась там jdk1.3 (JVM от SUN). Как сейчас дела с JVM под Линух обстоят не знаю.
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966727
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю иначевообще говоря, native thread's как раз и есть либо green, либо с чередованием по времени.

Везде пишут, что в линухе green, а в винде slicing, и что это существенно влияейт на исполнение потоков.

Или ты говоришь о JVM других производителей, не sun?
Native threads - это как раз slicing, а green threads фактически эмуляция потоков в одном реальном потоке ОС. Под линуксом в Sun JVM 1.3 использовалась именно эмуляция потоков. По крайней мере так сами сановцы пишут :) Опыт использования Java на Win2K/Linux их слова подтверждает.
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966774
потестим
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Принято.
Как бы то ни было, получается, что всё зависит от ОS, а не JVM.
На линухах получаем green, на виндах slicing, что не практически не зависит от версии/производителя JVM :)
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966778
потестимПринято.
Как бы то ни было, получается, что всё зависит от ОS, а не JVM.
На линухах получаем green, на виндах slicing, что не практически не зависит от версии/производителя JVM :)
точнее от версии/производителя jre.
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966818
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потестимПринято.
Как бы то ни было, получается, что всё зависит от ОS, а не JVM.
На линухах получаем green, на виндах slicing, что не практически не зависит от версии/производителя JVM :)
ИМХО неверно. Потоки ОПЕРАЦИОННОЙ СИСТЕМЫ в линуксе и винде устроены примерно одинаково - по принципу вытесняющей многозадачности. Проблема именно в реализации работы явовских потоков Thread. Если они используют системные потоки (то есть фактически делегируют ОС управление КАЖДЫМ потоком), то это будут native threads, а если используется ОДИН поток операционной системы, в котором JVM эмулирует многопоточность, сама выдавая кванты времени на исполнение java-потоков - это уже green threads. От ОС тоже, конечно, зависит, но от реализации потоков в JVM зависит намного сильнее. Например, на ОС с вытесняющей многозадачностью и native threads в JVM невозможно создать selfish (монопольный) поток. А если реализовать на той же самой ОС JVM с green threads, то монопольный поток не даст ни одному другому потоку получить управление.
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966849
не важно
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ты не понял, что я хотел сказать.

Да, всё именно так, как говоришь ты.
Но, если посмотреть как это выглядит внешне, то мы видим одну и туже jre запущенную под linux и win. В первом случае имеем green, во втором slicing.
А то, что в одной версии jre для разных OS используется разная jvm - скрыто от глаз.

Кстати, у меня в памяти отлажились слова, что каждый java thread в linux реализуется как отдельный процесс (это можно пронаблюдать запустив ps), и взаимодействие между этими процессами крайне сложно осуществлять и т.д. в таком же роде. Скорее всего, я что-то не так понял, буду разбираться, искать источник :)
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966866
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не важноты не понял, что я хотел сказать.

Да, всё именно так, как говоришь ты.
Но, если посмотреть как это выглядит внешне, то мы видим одну и туже jre запущенную под linux и win. В первом случае имеем green, во втором slicing.
А то, что в одной версии jre для разных OS используется разная jvm - скрыто от глаз.

Кстати, у меня в памяти отлажились слова, что каждый java thread в linux реализуется как отдельный процесс (это можно пронаблюдать запустив ps), и взаимодействие между этими процессами крайне сложно осуществлять и т.д. в таком же роде. Скорее всего, я что-то не так понял, буду разбираться, искать источник :)
Теперь понял и почти соглашусь :) Однако, видимо, под линуксом многое действительно зависит от конкретной версии и производителя JRE.
З.Ы. Все-таки мне кажется, что термин "native" лучше отражает суть реализации, чем "slicing"... Хотя это дело вкуса.
...
Рейтинг: 0 / 0
как работают приоритеты в потоках
    #32966889
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил сейчас на Линухе, так там все еще зеленые потоки, java такая стоит:
Код: plaintext
1.
2.
3.
java version "1.4.2_06"
Java(TM)  2  Runtime Environment, Standard Edition (build  1 . 4 .2_06-b03)
Java HotSpot(TM) Client VM (build  1 . 4 .2_06-b03, mixed mode)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / как работают приоритеты в потоках
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]