Использование нитей в Java
Перевод на русский © , 2000
Java Q&A
Может ли программист задать для своего кода использование green threads или native threads?
Нет. Только пользователь может решить, какой пакет поддержки нитей будет использоватся при запуске Java программы. Более того, когда программа запущена, нельзя переключится между green threads и native threads.
Следовательно, вы должны написать код таким образом, чтобы он мог работать как с green threads, так и с native threads. Native threads относительно просты, так как они используют систему управления нитями операционной системы, большинство из которых гарантирует что каждая нить получит возможность работы. Нити с высоким приоритетом запускаются чаще, чем нити с низким, но все они получают возможность работать.
Green threads, однако, не обеспечивают такой гарантии. Если работает нить с высоким приоритетом, цикл в коде, который никогда не выполняет sleep(), yield(), wait() или perform() некоторые блокирующие функции ввода-вывода (I/O) не даст возможности работать другим нитям. Можно только пообещать, что нити с высоким приоритетом будут преобладать над нитями с низким. Это значит, что вся работа по распределению времени лежит на плечах программиста. Следовательно, код, который сам отвечает за распределение времени между нитями будет нормально работать как с green threads, так и с native threads; и, дополнительно, будет хорошо работать с native threads в любой операционной системе.
Брать на себе ответственность за распределение времени в программе кажется трудным, но, на самом деле, для большинства программ нужно сделать не так уж много. Каждый раз, когда нить выполняет сетевую операцию или операцию ввода-вывода, она должна дать возможность работать другой нити.
Распределение времени намного более важно для программ с нитями, которые работают в цикле или тратят значительное время на математические расчеты без ввода-вывода. В этих случаях простой вызов Thread.yield() достаточен для того, чтобы дать возможность работать другим нитям с тем же приоритетом. Для разделения процессорного времени с низко-приоритетными нитями, нить может вызвать Thread.sleep(), или, более точно, wait() для объекта пока нить с низким приоритетом не даст сигнал окончания работы, вызвав notify() для объекта.