Java线程与Pthreads

时间:2011-03-11 06:05:24

标签: java multithreading posix

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

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

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

3 个答案:

答案 0 :(得分:18)

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

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

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

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

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

答案 1 :(得分:4)

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

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

我希望你明白了。

答案 2 :(得分:-1)

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