Java线程输出答案错误
而不是我所希望的Java线程输出答案错误,java,multithreading,Java,Multithreading,而不是我所希望的 run: Odd numbers Even and odd numbers paired 1 3 5 7 9 1 2 | 3 4 | 5 6 | 7 8 | 9 10 | 我很困惑我做错了什么,导致输出结果是这样的输出完全是意料之中的,尽管它的顺序有点随机。这里发生的是: oddThread写“奇数” evenOddThread写入“偶数和奇数成对” oddThread写入“1 3 5 7 9”(无换行符) evenOddThread写道:“12 | 3 4 | 5 6
run:
Odd numbers
Even and odd numbers paired
1 3 5 7 9 1 2 | 3 4 | 5 6 | 7 8 | 9 10 |
我很困惑我做错了什么,导致输出结果是这样的输出完全是意料之中的,尽管它的顺序有点随机。这里发生的是: oddThread写“奇数” evenOddThread写入“偶数和奇数成对” oddThread写入“1 3 5 7 9”(无换行符) evenOddThread写道:“12 | 3 4 | 5 6 | 7 8 | 9 10 |” 所以,你本身没有做错什么。但是,您没有考虑当同时运行两个线程时会发生什么。要么不这样做(通过调用oddThread.join(),等待oddThread完成,然后再启动evenOddThread),要么在其中进行一些同步,以确保以原子方式写入输出。你有点幸运能得到你得到的输出。我还可以:
- 只是起作用了,直到它不起作用
- 更糟糕的是混合了产出,比如1 12 3 | 3 4 5 7 | 5 6 9 | 7 8 | 9 10|
- 将evenOddThread输出置于oddThread之上(可能不太可能,但无法保证线程的调度方式)
- 两个线程并行运行,而不是一个接一个地运行(这是线程的首要目的)。这就是为什么他们的产出混淆了
试图解释您看到的输出:“奇数”线程有一点领先,让它先打印“奇数”。然后“奇偶”线程启动并打印“事件和奇数配对”。接下来,“奇偶”会休眠600毫秒(相当于计算机时间的半个永恒),让“奇偶”拥有完成打印序列所需的全部时间。600毫秒结束后,“奇偶”将返回并打印自己的序列(每对延迟600毫秒,但这不再重要,因为“奇偶”早已完成)
但这绝不是决定性的。也就是说,如果您运行程序几次,您可能会看到完全不同的字符串输出序列
run:
Odd numbers
Even and odd numbers paired
1 3 5 7 9 1 2 | 3 4 | 5 6 | 7 8 | 9 10 |
run:
Odd numbers
1 3 5 7 9
Even and odd numbers paired
1 2 | 3 4 | 5 6 | 7 8 | 9 10 |