Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程输出答案错误_Java_Multithreading - Fatal编程技术网

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 |