gpt4 book ai didi

Java代码 - 线程相互阻塞

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

我是多线程的新手。我正在尝试编写一个有两个线程的程序。一个线程打印奇数然后使用 wait() 放弃监视器锁,类似地另一个线程打印偶数并在打印数字后放弃锁
我有4节课

  1. Odd.java(打印1-100之间的奇数)
  2. Even.java(打印1-100之间的偶数)
  3. SomeMaths.java(有打印奇数和偶数的逻辑)
  4. OEApp.java(启动线程的主类)

问题 - 我的代码大部分时间都按预期工作,即它按顺序打印数字 1 到 100。两个线程轮流。但是我注意到有一个错误。有时偶数线程首先被调度并低于输出

2    **********
1 ###############################

在那之后什么也没有打印出来,看起来出现了死锁情况。我不知道为什么。请帮助我理解这一点

public class SomeMaths {

public synchronized void printOdd(){
for( int i=1;i<=100;i++){
if(i%2 !=0) {
System.out.println(i + " ###############################");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
}
}

public synchronized void printEven(){
for(int i=1;i<=100;i++){
if(i%2 ==0){
System.out.println(i +" **********");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
}
}
}

public class Odd implements Runnable {

SomeMaths sm;

public Odd(SomeMaths sm){
this.sm = sm;
}
@Override
public void run(){
sm.printOdd();
}
}

public class Even extends Thread {

SomeMaths sm;

public Even(SomeMaths sm){
this.sm = sm;
}

@Override
public void run(){
sm.printEven();
}
}

public class OEApp {

public static void main(String[] args) {

SomeMaths sm = new SomeMaths();

Thread odd = new Thread(new Odd(sm));
Thread even = new Thread(new Even(sm));

odd.start();
even.start();

try {
odd.join();
even.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

最佳答案

我相信它是这样工作的:

  1. 偶数线程启动,1 是奇数所以它调用通知(不通知任何人),然后 2 是偶数所以它打印一条消息并等待

  2. 奇数线程启动,1 是奇数所以它打印一条消息并等待

  3. 没有人调用通知所以两个线程永远等待

关于Java代码 - 线程相互阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45390716/

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