.start()方法后线程执行

lev*_*lev 3 java concurrency multithreading java-threads

我想知道在以下情况下会发生什么:

创建了两个线程:

Thread t1 = new Thread();
Thread t2 = new Thread();
Run Code Online (Sandbox Code Playgroud)

假设这些只是打印出一个字符串,然后线程调用 .start() 方法:

t1.start();
t2.start():
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么这些线程每次都以看似随机的顺序打印?我知道线程是并发执行的,但由于主进程的顺序执行,线程t1不会总是先完成?t2

kaa*_*aan 5

在 a上调​​用start()Thread并不一定会导致线程随后立即运行。在您的调用和实际运行的start()线程方法的第一行之间可能会发生其他事情。run()即使您run()实际运行后,也可能在您运行之前、期间或之后发生其他事情run()方法完成之前、期间或之后发生其他事情。

\n\n

在你的问题中,你说:“假设这些只是打印出一个字符串” \xe2\x80\x93 这里是一个实现run()

\n\n
public void run() {\n    System.out.println("my name is: " + getName());\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,有可能先t1 开始运行,但在实际调用之前System.out.printlnt2允许执行并运行到完成,然后t1恢复。

\n\n

如果这种行为不适用于您的用例,您将需要添加某种并发保护来协调线程的运行方式和时间。

\n\n

更新:

\n\n

为了说明线程执行的不可预测的顺序,请运行此代码几次并观察输出:

\n\n
public class Example {\n    public static void main(String[] args) {\n        for (int k = 0; k < 10; k++) {\n            new TestThread(k).start();\n        }\n    }\n}\n\nclass TestThread extends Thread {\n    private final int k;\n\n    TestThread(int k) {\n        this.k = k;\n    }\n\n    @Override\n    public void run() {\n        System.out.print(k + " ");\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的本地运行之一的输出:

\n\n
7 0 1 5 4 6 3 2 8 9 \n
Run Code Online (Sandbox Code Playgroud)\n

  • 谢谢你的澄清,我很感激 (2认同)