多线程执行顺序

use*_*151 4 java multithreading

假设我们有这样的场景:

class Stack{

public void main{

ChildThread1 t1 = new ChildThread1;
ChildThread1 t2 = new ChildThread1;
ChildThread1 t3 = new ChildThread1;

//then we make some ChildThread2 objects and some ChildThread3 objects

ChildThread2 s1 = new ChildThread2;
//...

ChildThread3 v1 = new ChildThread3;
//...

//now we let all threads start in mix order
t1.start();
v1.start();
//...

SOP("All threads are ready");

//then we let them run with join()
t1.join();
t2.join();
t3.join();

s1.join();
//...

v1.join();
//...
Run Code Online (Sandbox Code Playgroud)

每种类型的线程在运行时都会打印自己唯一的语句。

我注意到每次执行程序时,输出总是不同的。例如,来自 ChilThread1 t1 的语句将在输出的中间打印而不是开始(因为 t1 首先启动)或者语句“所有线程都准备好了”将在线程执行中间弹出(例如:ChildThread2 是“所有线程都准备好了” ' 跑步 )

所以我试图找到一个答案,我找到了这个网站:http : //www.avajava.com/tutorials/lessons/how-do-i-use-threads-join-method.html 该网站基本上说没有保证订单使用 start() 时的执行

那么我是否正确地假设这种奇怪的打印顺序是因为 start() 不保证执行顺序?这个原因是否也适用于“所有线程都准备就绪”的问题?

NPE*_*NPE 5

线程的全部意义在于它们可以并发执行。如果您想确保完成事情的特定顺序,您要么必须放弃使用线程,要么使用显式同步。

那么我是否正确地假设这种奇怪的打印顺序是因为 start() 不保证执行顺序?

这是正确的。当你start是一个线程时,主线程和新创建的线程之间基本上存在竞争条件。这意味着无法说明两个线程之间发生的相对顺序。如果要确保特定顺序,请使用同步。


Azo*_*ous 1

那么我是否可以假设这种奇怪的打印顺序是因为 start() 不能保证执行顺序?

是的。你是对的。

这个原因也适用于“所有线程都准备好”问题吗?

是的。又对了。你的SOP由主线程运行。因此,有可能在有机会执行它t1之前打印一些东西。mainSOP