gpt4 book ai didi

java - 我使用 2 个线程打印 10 以内的偶数奇数的实现有什么问题

转载 作者:行者123 更新时间:2023-12-02 12:08:56 24 4
gpt4 key购买 nike

我正在尝试使用两个不同的线程打印偶数和奇数。有人可以指出我犯的错误吗?目前,输出如下所示:

奇数:1

等待1

通知2

还要等2

请找到下面的代码:

 public class EvenOdd {
public static void main(String[] args) {
PrintEvenOdd p1=new PrintEvenOdd(false);
PrintEvenOdd p2=new PrintEvenOdd(true);
p1.start();
p2.start();
}
}
class PrintEvenOdd extends Thread{
boolean isEven;
boolean isOdd=true;

public PrintEvenOdd(boolean e) {
isEven=e;
}

public synchronized void run() {
if(isEven) {
for(int i=2;i<=10;i+=2)
{
while(isOdd) {
try {
System.out.println("going to wait 1");
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Even: "+i);
isOdd=true;
System.out.println("notify 1");
notifyAll();

}
}
if(!isEven) {
for(int i=1;i<=10;i+=2) {
while(!isOdd) {
try {
System.out.println("going to wait 2");
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Odd: "+ i);
isOdd=false;
System.out.println("notify 2");
notifyAll();
}
}
}
}

最佳答案

由于我不太清楚你的算法的主要思想,我只是指出错误在哪里,你可以尝试自己修复它。

当你一个接一个地启动线程时:p1.start(); p2.start(); 它们的执行顺序与我们启动时的顺序相同。

当第一个线程调用同步void run()方法时,它会锁定PrintEvenOdd.class上的监视器。这意味着第二个线程将等待,直到第一个线程释放监视器(也就是说不会执行任何单行代码)。

在调试器中进一步通过第一个线程执行流程,您将看到以下操作:

  • 下拉至 if(!isEven) 条件
  • i=1循环迭代期间设置isOdd=false
  • i=2 循环迭代期间进入无限的 wait()

由于 wait 操作不会释放类监视器,因此当两个线程都挂起时,您会遇到这种情况。

关于java - 我使用 2 个线程打印 10 以内的偶数奇数的实现有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46695129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com