Гарантирует ли спецификация, что все операции на последовательных Java-потоках выполняются в текущем потоке?(За исключением «forEach» и «forEachOrdered»)
Я явно запрашиваю спецификацию, а не то, что делает текущая реализация.Я сам могу посмотреть текущую реализацию и не нужно беспокоить вас этим.Но реализация может измениться, и есть другие реализации.
Я спрашиваю из-за ThreadLocals: я использую Framework, который использует ThreadLocals для внутреннего использования.Даже простой вызов, такой как company.getName (), в конечном итоге использует ThreadLocal.Я не могу изменить, как эта структура разработана.По крайней мере, не в разумный промежуток времени.
Спецификация кажется здесь запутанной.Документация пакета "java.util.stream" гласит:
Если поведенческие параметры действительно имеют побочные эффекты, если явно не указано, нет никаких гарантий относительновидимость этих побочных эффектов для других потоков, и нет никаких гарантий того, что различные операции над «одним и тем же» элементом в одном и том же потоковом конвейере выполняются в одном потоке .
...
Даже когда конвейер ограничен для получения результата, который соответствует порядку встречи с источником потока (например, IntStream.range (0,5) .parallel (). Map (x ->x * 2) .toArray () должен выдавать [0, 2, 4, 6, 8]), не даются гарантии относительно порядка, в котором функция mapper применяется к отдельным элементам, или в каком потоке выполняется любой поведенческий параметр для данного элемента.
Я бы интерпретировал это как: каждая операция в потоке может происходить в другом потоке.Но документация "forEach" и "forEachOrdered" прямо заявляет:
Для любого данного элемента действие может быть выполнено в любое время и в любом потоке, выбранном библиотекой.
Этот оператор был бы излишним, если бы каждая потоковая операция могла происходить в неопределенном потоке.Следовательно, верно ли обратное: все операции над последовательным потоком гарантированно выполняются в текущем потоке, за исключением «forEach» и «forEachOrdered»?
Я гуглил авторитетный ответ о комбинации "Java "," Stream "и" ThreadLocal ", но ничего не нашел.Закрытие было ответом Брайана Гетца на связанный вопрос здесь, в Переполнении стека, но речь идет о порядке, а не о потоке, и речь идет только о «forEach», а не о других методах потока: Учитывает ли Stream.forEach порядок встречи последовательных потоков?