Установить стек вызовов Java

Можно ли изменить/получить доступ к стеку вызовов Java? Например, сохранение и восстановление? Я думаю о реализации совместной многозадачности (особенно ввода-вывода), как gevent для python или haskell (который делает это изначально). Беспорядок спагетти асинхронного обратного вызова не может быть лучшим решением.


person Kr0e    schedule 31.07.2013    source источник


Ответы (1)


Самое простое решение - иметь несколько потоков. На сервере может эффективно работать до 10 000 потоков. Если вам нужно нечто большее, я бы предложил либо а) купить второй сервер, либо б) использовать неблокирующий ввод-вывод.

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

Существуют библиотеки для этого в Java различными способами. Все они страдают от общей проблемы, они либо медленнее, либо намного сложнее, либо и то, и другое.

Кстати, я подчеркиваю это, потому что при переключении контекста потока он делает именно то, что вы предлагаете, но ОС делает это за вас.

person Peter Lawrey    schedule 31.07.2013
comment
10000 было бы неплохо. Но я думал, что такое количество потоков будет означать тонны переключений контекста, которые, в свою очередь, значительно снижают производительность. Ситуация становится еще хуже, когда потокам необходимо взаимодействовать. Облегченные потоки хороши, потому что нет переключения контекста, которое потребовало бы блокировки ядра и т. Д. Практически это было бы довольно просто, если бы Java позволяла мне программно обращаться к стеку. Мне нравится концепция дешевых собственных потоков ОС, но я не думаю, что это возможно. РЕДАКТИРОВАТЬ: тогда легкими потоками можно было бы управлять с помощью асинхронного ввода-вывода. - person Kr0e; 31.07.2013
comment
Потоки Java не обязательно являются потоками ядра. JVM может свободно реализовывать потоки по своему усмотрению, и объединение потоков является обычным явлением. Изменение стека вызовов в реальном времени — это, по сути, то же самое, что и переписывание виртуальной машины, и это невозможно сделать из самой Java. Это может сделать агент VM, но гораздо лучше использовать отлаженную и настроенную реализацию потоков, которая у вас уже есть. - person chrylis -cautiouslyoptimistic-; 31.07.2013
comment
Я не знаю JVM, которая не использует потоки ядра, помимо одной из первых JVM (1.1). Но они довольно быстро превратились в потоки ядра. Поэтому вероятность того, что когда-нибудь реализации JVM будут поддерживать облегченные потоки, весьма маловероятна. Для сетевых приложений подойдут зеленые потоки. К сожалению, только несколько языков действительно поддерживают зеленые потоки, такие как Haskell, Go и C# (C# как бы подделывает их, не так красиво, как Haskell или Go), Python использует Gevent. Ну, я думаю, мне придется использовать миллиард строк спагетти-кода обратного вызова =( - person Kr0e; 01.08.2013
comment
Существуют библиотеки, которые поддерживают продолжения, но они медленнее и не используются для повышения производительности (они могут быть полезны по другим причинам). это пустая трата времени. Я бы позволил потокам ОС делать то, для чего они предназначены, если только вы не знаете, что это проблема, а не на основании ощущения, что было бы неплохо не делать этого. - person Peter Lawrey; 01.08.2013