当前位置: 首页 > 知识库问答 >
问题:

Java-多线程的Why.join()不影响执行顺序

巢烨
2023-03-14

我目前在Java的编程课上学习多线程。根据我的理解,不同线程的执行顺序是无法预测的,因此确保我们实现机制以确保所有东西都按所需的顺序执行是很重要的。

我学到的机制之一是使用thread.join(),它强制一个线程等待,直到其他线程完成执行。然而,下面的示例代码实际上让我更加困惑:

Runnable hello = () -> {
            System.out.print("H");
            System.out.print("e");
            System.out.print("l");
            System.out.print("l");
            System.out.print("o\n");
        };

        Runnable world = () -> {
            System.out.print("W");
            System.out.print("o");
            System.out.print("r");
            System.out.print("l");
            System.out.print("d\n");
        };

        Thread t1 = new Thread(hello);
        Thread t2 = new Thread(world);

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
            System.out.println("Finished");
        } catch (InterruptedException ie) {
            System.out.println("Interruption");
        }

这段代码应该演示.join()是如何工作的,它将执行hello(),然后world()得到一个正确打印的“hello world”

然而,当我实际运行代码时,执行的顺序似乎仍然是随机的。我得到的结果是

// #1
WoHerld
llo
Finished

// #2
HWello
orld
Finished
// And others

那么,使用.join()的目的是什么,执行的顺序还是这样“乱七八糟”?而我在这里应该做什么来确保每次运行代码时都能有一个正确打印的结果呢?

共有1个答案

凌修伟
2023-03-14

本例中的Join只说明最后一行“finished”总是正确的。单独打印字符的两个线程不能保证顺序,因为两个线程都在写入同一个输出缓冲区,在本例中为stdout(或system.out)。

保证执行顺序在使用锁或互斥体的范围内,在Java的情况下使用synchronized关键字。

 类似资料:
  • 我知道线程是并发运行的,所以您无法预测执行的顺序,但在提供的代码中,我在运行其他代码之前加入了thread。如果应该等到线程执行完毕,那么为什么顺序仍然是随机的呢?在两个print语句之前加入任何内容总是会导致它们最后被打印,而如果我在之后加入所有内容,它并不总是最后,为什么?

  • 问题内容: 我尝试从一本书(Paul Hyde,Java Thread Programming)中运行示例。它说线程的顺序将互换。但是我总是得到:之后打印10个“主线程”,然后打印10个“新线程”。更有趣的是:如果我将使用tt.run而不是tt.start,那么结果将相反。也许这本书太老了,示例基于JDK 1.2的原因???代码如下: 问题答案: JVM决定何时将控制权从主线程转移到第二个线程。由

  • 这是一个关于Java中多线程的初学者问题。 根据我的理解,当创建多个(用户)线程来运行程序或应用程序时,就没有父线程和子线程的概念。它们都是独立的用户线程。 因此,如果主线程完成执行,那么另一个线程(Thread2)仍将继续执行,因为在Thread2的执行线程完成之前,它不会被JVM杀死(https://docs.oracle.com/javase/6/docs/api/java/lang/Thr

  • 问题内容: 我们有一个基于石英的调度程序应用程序,该应用程序每分钟运行约1000个作业,每分钟的秒数均匀分布,即每秒约16-17个作业。理想情况下,这16-17个作业应同时触发,但是该作业的execute方法的第一个语句(仅记录执行时间)非常晚。例如,假设我们从05:00到05:04每分钟安排1000个作业。因此,理想情况下,计划在05:03:50进行的作业应该在05:03:50记录了execut

  • 在阅读关于流的留档时,我遇到了以下句子: > 。。。试图从行为参数访问可变状态会给您带来错误的选择。。。如果您不同步对该状态的访问,您将面临数据竞争,因此您的代码将被破坏。。。[1] 如果行为参数确实有副作用。。。[没有]保证在同一个线程中执行同一流管道中“相同”元素上的不同操作。[2] 对于任何给定的元素,可以在库选择的任何时间和线程中执行该操作。[3] 这些句子没有区分顺序流和平行流。因此,我

  • 我们有1000多条数据,请求1000次第三方个接口, 效率很是低下! 所以我想利用多线程的方式快速的调用完这1000次接口请求并处理响应 但是有个问题,线程是在for循环中执行的,调用顺序肯定是错乱的,这就导致接调用后 返回的结果肯定和List中的不匹配了··· 这种情况怎么能保证顺序呢?这是我的代码