编译Java以表现得像GO代码

sky*_*yde 1 java compiler-construction multithreading go

是否有可能编写一个Java编译器或虚拟机,它可以让您编译使用线程和阻塞系统调用的旧Java应用程序,就像编译GO程序一样.

因此新的Thread().run(); 将创建轻量级线程,并且所有阻塞系统调用将改为异步操作系统调用并使轻量级线程产生.

如果没有,这是不可能的主要原因是什么!

Jam*_*dge 6

Solaris(以及其他UNIX系统)上早期版本的Sun Java运行时使用了称为" 绿色线程 " 的用户空间线程系统.如Java 1.1 for Solaris文档中所述:

多对一模型的实现(许多用户线程到一个内核线程)允许应用程序创建可以并发执行的任意数量的线程.在多对一(用户级线程)实现中,所有线程活动都仅限于用户空间.此外,一次只有一个线程可以访问内核,因此操作系统只知道一个可调度实体.因此,这种多线程模型提供有限的并发性,并且不利用多处理器.Solaris系统上Java线程的初始实现是多对一的,如下图所示.

通过使用操作系统的线程支持,这很早就被取代了.在Solaris中的情况下,之前的Solaris 9,这是一个M:N"多对多"系统类似于去,其中该线程库调度若干程序线程在内核级线程的较小数目的.在Linux和更新版本的Solaris上使用1:1系统的系统中,用户线程直接与内核级线程对应,但事实并非如此.

我认为从那时起就没有任何严肃的计划让Sun/Oracle JVM远离使用本机线程库.正如历史所示,JVM肯定有可能使用这样的模型,但它似乎并不被认为是值得追求的方向.