Java线程:start() - 它如何创建一个新线程?

4

我想知道java线程的start方法中写什么,使它能够创建一个新的线程?


Voila: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Thread.java。 - Oliver Charlesworth
4
简而言之,黑魔法。在Thread.start和黑魔法之间可能有几个层次,但最终(假设是较现代的JVM),它会请求操作系统创建一个新的线程,而操作系统如何创建线程不需要你操心;-) - user395760
1
“start” 调用了本地代码的 “start0”,因此查看 “start” 的源代码并不能提供太多帮助。 - user2357112
3个回答

2
这是一种本地方法,这意味着它不是在Java本身中实现的,而是在C++中实现的。
除了JVM管理之外,它确切的作用取决于JVM运行的平台;在Linux上,它会运行类似于pthread_create()或者直接运行clone()。我不知道Windows的替代方案是什么。
Java将底层机制隐藏起来有两个主要原因:一部分是为了让你更容易编写Java程序,而无需知道它们将在哪个操作系统上运行,作为对你的抽象和服务;但另一部分也是因为能够直接调用这样的本地功能会破坏Java所施加的安全模型,因此也是为了确保没有Java程序可以在没有明确权限的情况下做出任何不当行为。
最后,我不确定你为什么在问这个问题,所以我不确定我是否真正回答了你的问题。

1
由于不同的平台有所不同,因此无法给出具体的答案(在很久以前有绿色线程,一切都很清晰 - 它们作为用户级线程运行)。自那时以来,它们已被原生线程取代,作为一种“优化”。也就是说,绿色线程被移除,以支持本地操作系统的惯用线程模型。无论如何,本地代码最终将调用您编写的run方法。

+1,但本地线程并非“优化以对应操作系统”:它是由操作系统提供的。 - user207421
@EJP - 是的,但我们在浪费时间,毕竟,每个人都知道线程用于并行运行代码,与最大化I/O带宽和最小化I/O延迟无关。:( ( - Martin James

1
与Java中的其他内容一样,通过start()方法创建线程涉及到JVM。 Java虚拟机的一般作用是充当您的方法调用和底层操作系统之间的中介者。这确保了Java环境以(大致)相同的方式运行,而不管操作系统如何(=>著名的Java可移植性)。但是,在它幕后所做的事情(即在JVM内部)不同,并取决于其正在运行的实际OS
例如,在Unix OS上创建线程调用函数(POSIX线程调用),在Windows系统上调用CreateThread函数(来自Win32 API)。这是由Java虚拟机调用的,因此您不必自己处理。
这些功能只是示例。根据特定JVM实现的不同OS,start()方法可能会执行其他魔术。
但是,原则仍然保持不变。启动(start())方法调用某些东西,该操作系统本地支持用于创建线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接