设置Java调用栈

问题描述:

是否可以修改/访问Java调用栈?例如保存和恢复?我正在考虑实现协作式多任务(特别是I/O),就像gevent for python或haskell(本身就是这样)。异步回调意大利面条混乱不能是最好的解决方案。设置Java调用栈

最简单的解决方案是有多个线程。您可以有多达10,000个线程高效地在服务器上运行。如果您需要的远不止这些,我会建议a)购买第二台服务器,或者b)使用非阻塞IO。

一般来说,使用多个线程是最简单的,对于少量的线程,也是最快的。

有许多库可以以各种方式在Java中执行此操作。他们都遇到了一个共同的问题,他们要么更慢,要么更复杂,或者两者兼而有之。

顺便提一下,我这样说是因为当一个线程上下文切换时,它完全按照您的建议进行操作,但是操作系统会为您做。

+0

10,000会很好。但我认为这么多的线程将意味着大量的上下文切换,从而大大降低了性能。当线程需要通信时,情况会变得更糟。轻量级线程是很好的,因为没有涉及内核锁等的上下文切换。实际上,它非常简单,如果Java允许我以编程方式访问堆栈。我喜欢廉价的本机操作系统线程的概念,但我不认为这是可能的。编辑:然后可以使用异步IO管理轻量级线程。 – Kr0e

+1

Java线程不一定是内核线程。 JVM可以*地实现线程,但是它需要,并且线程池是常见的。修改实时调用堆栈与重写虚拟机基本相同,并且在Java本身内部无法做到这一点。 VM代理可以这样做,但使用已有的调试和调优线程实现会更好。 – chrylis

+0

我不知道没有使用第一个JVM(1.1)之一旁边的内核线程的JVM。但他们对内核线程的改变很快。因此,在某些时候JVM实现将支持轻量级线程的可能性非常小。对于网络应用程序来说,绿色线程是你走的路。不幸的是,只有几种语言确实支持像Haskell,Go和C#这样的绿色线程(C#有点像它们,而不像Haskell或Go那么漂亮),使用Gevent的Python。嗯,我想我必须去与十亿行回调意大利面代码=( – Kr0e