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() 不保证执行顺序?这个原因是否也适用于“所有线程都准备就绪”的问题?
线程的全部意义在于它们可以并发执行。如果您想确保完成事情的特定顺序,您要么必须放弃使用线程,要么使用显式同步。
那么我是否正确地假设这种奇怪的打印顺序是因为 start() 不保证执行顺序?
这是正确的。当你start
是一个线程时,主线程和新创建的线程之间基本上存在竞争条件。这意味着无法说明两个线程之间发生的相对顺序。如果要确保特定顺序,请使用同步。
那么我是否可以假设这种奇怪的打印顺序是因为 start() 不能保证执行顺序?
是的。你是对的。
这个原因也适用于“所有线程都准备好”问题吗?
是的。又对了。你的SOP
由主线程运行。因此,有可能在有机会执行它t1
之前打印一些东西。main
SOP
归档时间: |
|
查看次数: |
11963 次 |
最近记录: |