Можно ли изменить/вызвать стек вызовов Java? Например, сохранение и восстановление? Я думаю о реализации совместной многозадачности (особенно I/O), как gevent для python или haskell (что делает это изначально). Асинхронный callback spaghetti mess не может быть лучшим решением.Set Java call stack
0
A
ответ
0
Простейшим решением является наличие нескольких потоков. На сервере может эффективно работать до 10 000 потоков. Если вам нужно гораздо больше этого, я бы предложил либо a) покупку второго сервера, либо б) использование неблокирующего ввода-вывода.
В общем, использование нескольких потоков является самым простым и для небольшого количества потоков, также является самым быстрым.
В библиотеке есть библиотеки, которые можно выполнять различными способами. Все они страдают от общей проблемы, они либо медленнее, либо намного сложнее, либо и то, и другое.
BTW Я делаю это, потому что, когда переключатель контекста потока выполняет именно то, что вы предлагаете, но ОС делает это за вас.
10 000 было бы очень приятно. Но я думал, что такое количество потоков будет означать тонны контекстных переключателей, которые, в свою очередь, значительно уменьшают производительность. Это становится еще хуже, когда потоки должны общаться. Легкие потоки хороши, потому что нет переключателя контекста, который включал бы блокировку ядра и т. Д. Практически это довольно просто, если бы Java позволяла мне обращаться к стеку программно. Мне нравится концепция дешевых потоков ОС, но я не думаю, что это возможно. EDIT: облегченные потоки могут управляться с использованием async IO. – Kr0e
Java-потоки не обязательно представляют собой потоки ядра. JVM может свободно реализовывать потоки, но хочет, и объединение потоков является обычным явлением. Изменение стека вызовов в реальном времени в основном такое же, как переписывание виртуальной машины, и нет возможности сделать это из самой Java. Агент VM мог бы сделать это, но вам намного лучше использовать отлаженную и настроенную реализацию потоков, которые у вас уже есть. – chrylis
Я не знаю JVM, который не использует потоки ядра рядом с одной из первых JVM (1.1). Но они довольно быстро изменились для потоков ядра. Поэтому вероятность того, что реализация JVM в некоторых случаях будет поддерживать легкие потоки, поэтому маловероятна. Для сетевых приложений зеленые потоки - это то, как вы идете. К сожалению, только несколько языков действительно поддерживают зеленые потоки, такие как Haskell, Go и C# (C# kinda подделывает их, а не так красиво, как Haskell или Go), Python использует Gevent. Ну, я думаю, мне нужно пойти с миллиардом строк кода спам-кода обратного вызова = ( – Kr0e