Java线程与Pthreads

Cha*_*ani 24 java multithreading posix

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

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

我是空白,面试官时间不长,最终他无法向我解释原因.

sbr*_*ges 21

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

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

public Thread(Runnable target, String name, ThreadGroup threadGroup, int priority, boolean daemon, ContextClassLoader contextClassLoader, long stackSize)
Run Code Online (Sandbox Code Playgroud)

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

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

  • posix API确实采用包含所有线程属性的结构.有问题的结构是pthread_attr_t.至于哪种方法更好,我不能站在一边.它高度依赖于你所熟悉的东西.它们没有任何真正的技术优势,它只是API的暴露方式. (5认同)

bes*_*sss 5

原因很多。但我会给你一些:

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

我希望你能明白。