gpt4 book ai didi

java - 使用线程打印奇偶数

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:02:13 24 4
gpt4 key购买 nike

使用线程打印奇偶数。创建一个线程类,两个线程实例。一个将打印奇数,另一个将打印偶数。

我做了以下编码。但是到了死锁状态。有人可以解释一下这可能是什么原因吗?

public class NumberPrinter implements Runnable{
private String type;
private static boolean oddTurn=true;


public NumberPrinter(String type){
this.type=type;
}
public void run() {
int i=type.equals("odd")?1:2;
while(i<10){
if(type.equals("odd"))
printOdd(i);
if(type.equals("even"))
printEven(i);
i=i+2;
}

}

private synchronized void printOdd(int i){
while(!oddTurn){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(type + i);
oddTurn=false;
notifyAll();
}

private synchronized void printEven(int i){
while(oddTurn){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(type + i);
oddTurn=true;
notifyAll();

}

public static void main(String[] s){
Thread odd=new Thread(new NumberPrinter("odd"));
Thread even=new Thread(new NumberPrinter("even"));
odd.start();
even.start();

}
}

输出:奇数1偶2


然后进入僵局!!!!!!

感谢您的帮助。

最佳答案

您正在等待并通知不同的对象(监视器)。

这个想法是你可以调用 obj.wait() 来等待别人做 obj.notify(),而你正在做 objA .wait()objB.notify()

将您的 printOdd 方法更改为类似

private void printOdd(int i) {
synchronized (lock) { // <-------
while (!oddTurn) {
try {
lock.wait(); // <-------
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(type + i);
oddTurn = false;
lock.notifyAll(); // <-------
}
}

printEven方法类似。

然后为 NumberPrinter 提供一个 lock 对象:

Object lock = new Object();
Thread odd = new Thread(new NumberPrinter("odd", lock));
Thread even = new Thread(new NumberPrinter("even", lock));

输出:

odd1
even2
odd3
even4
odd5
even6
odd7
even8
odd9

关于java - 使用线程打印奇偶数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6017281/

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