gpt4 book ai didi

java - 为什么来自 main 方法的代码在 java 中的其他线程之前执行

转载 作者:行者123 更新时间:2023-11-29 06:50:42 26 4
gpt4 key购买 nike

我有一个带有 main 方法的主类。我创建了两个线程 我注意到来自主线程的代码在创建线程之前执行。我期待的是同时运行它。为什么 main 方法中的代码会执行 Threads 中的 berofe 代码?

主类:

public class Main extends Thread {
public static void main(String[] args) {
NewThread thread = new NewThread("Thread1");
NewThread thread2 = new NewThread("Thread2");
for (int i = 0; i <3 ; i++) {
System.out.println("From main thread");
}
thread.start();
thread2.start();

}

新线程类

public class NewThread extends Thread{

public NewThread(String name) {
this.setName(name);
}
public void run() {
int clientnumber = 1;
while(clientnumber!= 3) {
System.out.println("server sent data to client: " + getName());
clientnumber++;
}
}

输出:

From main thread
From main thread
From main thread
server sent data to client: Thread2
server sent data to client: Thread1
server sent data to client: Thread2
server sent data to client: Thread1

最佳答案

Why code from main method executes before code from Threads?

很简单,因为它可以。

当您start() 一个线程时,父线程或子线程可能被安排为接下来运行。或者他们可以同时安排。或者可以安排一个完全不同的线程。

Java 语言和运行时系统不保证线程调度顺序。此外,对于不同的执行平台,线程调度行为可能不同1;例如取决于你有多少核心。

(为什么?因为,这就是典型操作系统上 native 线程调度的工作方式。Java 无法解决这个问题,仍然使用 native 线程。使用用户空间线程和线程调度存在严重的性能问题。Sun 几十年来放弃了这种方法前。)

你如何解决这个问题?

  • 不要对调度和线程的执行顺序做出假设。

  • 如果您的应用程序确实需要一个线程在另一个线程之前运行,请使用并发原语或类之一来实现它……显式。 (但请注意,强制一个线程在另一个线程之前运行会降低有效并发性。)

在您的示例中,问题基本上是您的期望不正确。一旦您调整了预期,这就不再是问题。


1 - 行为在给定平台上很可能是可重复的,尤其是在像您这样的小/简单示例中。但话又说回来,如果您在系统负载很重的情况下运行测试,它可能会改变。请记住:没有任何保证!

关于java - 为什么来自 main 方法的代码在 java 中的其他线程之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49225697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com