Java线程与Pthreads

我今天在接受采访时被问到这个问题。

“当我们使用pthread_create() (POSIX Threads)创建一个线程时,线程就会自行启动。为什么我们需要在Java中显式调用start() 。当我们创建一个实例时,Java没有启动线程的原因是什么它。“

我一片空白,面试官时间不够,最终他无法向我解释原因。

在Java中,不立即启动线程会导致更好的API。 您可以在线程(守护程序,优先级)上设置属性,而无需在构造函数中设置所有属性。

如果线程立即启动,则需要构造函数,

 public Thread(Runnable target, String name, ThreadGroup threadGroup, int priority, boolean daemon, ContextClassLoader contextClassLoader, long stackSize) 

允许在线程启动之前设置所有这些参数。 线程启动后无法设置守护程序属性。

我猜测POSIX API在调用pthread_create()采用了包含所有线程属性的结构,因此立即启动线程是有意义的。

原因很多。 但我给你几个:

  • 线程本身可能在返回实例之前开始执行。
  • 在运行线程之前必须正确设置上下文类加载器(请看上一点)
  • 应在启动线程之前设置优先级等额外配置
  • pthreads使用指向初始化结构的指针,因为java.lang.Thread无法在c-tor的末尾正确初始化,请参阅上面的几点; 直接调用本机pthread_create来实际执行代码毫无意义

我希望你有这个主意。

我的感觉是,Java允许操作系统安排(运行)线程,而不允许用户,因为操作系统更好地了解执行环境和调度。