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
在 a上调用start()Thread并不一定会导致线程随后立即运行。在您的调用和实际运行的start()线程方法的第一行之间可能会发生其他事情。run()即使您run()实际运行后,也可能在您运行之前、期间或之后发生其他事情run()方法完成之前、期间或之后发生其他事情。
在你的问题中,你说:“假设这些只是打印出一个字符串” \xe2\x80\x93 这里是一个实现run():
public void run() {\n System.out.println("my name is: " + getName());\n}\nRun Code Online (Sandbox Code Playgroud)\n\n因此,有可能先t1 开始运行,但在实际调用之前System.out.println,t2允许执行并运行到完成,然后t1恢复。
如果这种行为不适用于您的用例,您将需要添加某种并发保护来协调线程的运行方式和时间。
\n\n更新:
\n\n为了说明线程执行的不可预测的顺序,请运行此代码几次并观察输出:
\n\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n\n这是我的本地运行之一的输出:
\n\n7 0 1 5 4 6 3 2 8 9 \nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1307 次 |
| 最近记录: |