join()在Java中如何工作?是否保证在main()之前执行?

join()在Java中如何工作?是否保证在main()之前执行?,第1张

join()在Java中如何工作?是否保证在main()之前执行? 简短答案

如何

join()
在Java 中工作?

我承认您的javadoc

join()
有点不清楚,因为
this
当您初次阅读它时,谁指的并不明显。

这意味着线程调用将

t.join()
阻塞直到线程
t
完成执行为止。如果
t
当前线程调用时已经完成
t.join()
,那么当前线程不会停止并且只会继续运行。
this
doc中的单词指的是
t
这里,而不是调用该方法的线程。

它能保证执行之前

main()
吗?

[…]如果不使用

main()
联接,则在任何地方执行线程执行[…]

您不应该

main()
整体考虑。的一部分
main()
在其他线程之前执行,部分在并行执行,然后在其他线程执行。这实际上是什么
start()
join()
控制。让我在下面解释。

你身上发生了什么
main()

以下是有关

t1.start()
和的事件顺序
t1.join()
。您显然可以以同样的方式思考
t3

  1. 执行

    main()
    前面的指令
    t1.start()

  2. t1.start()
    启动线程
    t1
    t1.run()
    可能不会立即启动。)

  3. main()
    之间的指令
    t1.start()
    t1.join()
    中的指令并行执行(*)
    t1.run()

    注意:示例中没有任何内容,因此此时仅执行t1.run()指令。

  4. t1.join()

    • 如果
      t1.run()
      已经完成,则什么也不会发生并
      main()
      继续进行
    • 如果
      t1.run()
      尚未完成, 则主线程停止并等待 直到
      t1.run()
      完成。然后
      t1.run()
      完成,然后
      main()
      继续。
    • 的指令
      main()
      t1.join()
      执行

在这里您可以看到:

  • 保证
    main()
    前面的部分
    t1.start()
    在执行 之前
    t1.run()
  • 的部分
    main()
    以下
    t1.join()
    是保证被执行 之后
    t1.run()

(*)参见以下有关并行性的部分

我的意思是 “并行执行”

假设您在两个线程A和B中执行了这两组指令:

// Thread A        |     // Thread B        | System.out.println("A1");     |     System.out.println("B1");System.out.println("A2");     |     System.out.println("B2");System.out.println("A3");     |     System.out.println("B3");

如果这两个线程是“并行执行的”,则意味着三件事:

  • 保证线程A的指令执行顺序:
    A1将在A2之前执行,而A2将在A3之前执行。

  • 保证线程B指令的执行顺序:
    B1将在B2之前执行,而B2在B3之前执行。

  • 但是,A和B的指令可以交织,这意味着以下所有可能(甚至更多):

A1,B1,A2,B2,B3,A3

B1,B2,A1,B3,A2,A3

A1,A2,A3,B1,B2,B3 //特殊情况下,A都在B之前执行

B1,B2,B3,A1,A2,A3 //特殊情况,其中B都在A之前执行


注意: 本节将并行性视为由 *** 作系统创建的一种错觉,以使用户感觉事情在同时运行,实际上,只有一个核心按顺序执行指令,从一个进程/线程跳转到另一个。

实际上,一条A指令和一条B指令可以在2个独立的内核上同时执行(真正的并行性)。
无论如何,上面的3个要点仍然存在。正如@jameslarge所指出的,通常我们会使用一系列事件来对并发进行建模,即使对于多核也是如此。这忽略了两个事件同时发生的概念,它不会带来任何有用的东西,但会带来并发症。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5501249.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存