gpt4 book ai didi

java - 为什么两个输出不同?

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

public class EvenOddWithTwoThreads **extends Thread**
{
private volatile int count = 1;
private volatile boolean flag = false;
@Override
public void run() {
while(count <=10){
synchronized (this) {
while(flag){
flag= false;
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() +count);
count= count+1;
flag = true;

notify();
}
}
}

public static void main(String[] args) {

EvenOddWithTwoThreads ins = new EvenOddWithTwoThreads();
**Thread t1 = new Thread(ins, "Odd Thread");**
**Thread t2 = new Thread(ins,"Even Thread");**

t1.start();
t2.start();

}
}

输出:

Odd Thread1

Odd Thread2

Odd Thread3

Even Thread4

Odd Thread5

Even Thread6

Odd Thread7

Even Thread8

Odd Thread9

Even Thread10

public class EvenOddWithTwoThreads **implements Runnable**{

private volatile int count = 1;
private volatile boolean flag = false;


@Override
public void run() {
while(count <=10){
synchronized (this) {
while(flag){
flag= false;
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() +count);
count= count+1;
flag = true;

notify();
}
}
}

public static void main(String[] args) {

EvenOddWithTwoThreads ins = new EvenOddWithTwoThreads();
Thread t1 = new Thread(ins, "Odd Thread");
Thread t2 = new Thread(ins,"Even Thread");

t1.start();
t2.start();

}
}

output :

Odd Thread1

Even Thread2

Odd Thread3

Even Thread4

Odd Thread5

Even Thread6

Odd Thread7

Even Thread8

Odd Thread9

Even Thread10

最佳答案

扩展 Thread 或实现 Runnable 不会改变代码的行为,但通常最好使用 Runnable 的原因解释 here .您展示的两个软件同样存在错误,只是巧合,第二个软件返回了正确的答案(我试图在我的机器上运行这两个软件,它们都返回了正确的答案)。

那么,这是怎么回事?开始时两个线程都处于RUNNABLE 状态,因此它们都可以获得内部锁(使用同步 原语)。在您的情况下,奇数线程会先获取它,因此偶数线程会进入 BLOCKED 状态。 Odd Thread 打印他的号码并通知(在这种情况下没有人)。在循环结束时,它释放内在锁并再次开始循环。现在 Even Thread 不再被锁阻塞,所以两个线程都可以尝试再次获取内在锁:这称为 Race Condition,意味着输出取决于两个线程的时间被执行。

在第一种情况下,Even Thread 更快并获得锁,但由于 flag 现在为 true,它进入 WAITING 状态,释放 Odd 使用的锁打印“Odd Thread2”并通知 Even Thread 进入 BLOCKED 状态的线程(有关详细信息,请参阅 here)。在循环结束时,Odd Thread 释放锁,我们再次处于两个线程都可以获得锁的相同情况:在最坏的情况下,Even Thread 总是先行并陷入 while 循环,等待 Odd线程完成所有工作。

关于java - 为什么两个输出不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41736438/

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