张大仙000 2022-03-16 16:57 采纳率: 50%
浏览 26

在jdk1.8下运行多线程的数字加减案例,为什么执行结果不是想要的,正常应该只能输出0,-1,1

在jdk1.8下运行多线程的数字加减案例,为什么执行结果不是想要的,正常应该只能输出0,-1,1

public class Test {
    public static void main (String[] args) throws java.lang.Exception
    {
        Resource resource=new Resource();
        AddThread at=new AddThread(resource);
        SubThread st=new SubThread(resource);
        new Thread(at,"加法线程A").start();
        new Thread(at,"加法线程B").start();
        new Thread(st,"减法线程X").start();
        new Thread(st,"减法线程Y").start();
//        System.out.println("hi");
    }
}

class Resource{
    int num;
    boolean flag=true;//true为标识可以进行加法操作无法进行减法操作,false为可以进行减法操作无法进行加法操作
    public synchronized void add() throws Exception{
        if (this.flag==false){
            super.wait();
        }
        Thread.sleep(100);
        this.num++;
        System.out.println("加法操作,"+Thread.currentThread().getName()+",this.num="+this.num);
        this.flag=false;
        super.notifyAll();
    }
    public synchronized void sub() throws Exception{
        if(this.flag==true){
            super.wait();
        }
        Thread.sleep(200);

        this.num--;//这个程序不加this结果就不对,不理解
        System.out.println("减法操作,"+Thread.currentThread().getName()+",this.num="+this.num);
        this.flag=true;
        super.notifyAll();
    }
}
class AddThread implements Runnable{
    Resource resource;
    public AddThread(Resource resource){
        this.resource=resource;
    }
    @Override
    public void run(){


        for(int x=0;x<10;x++){
            try{
                this.resource.add();
            }catch(Exception e){
                e.printStackTrace();
            }

        }
    }

}
class SubThread implements Runnable{
    Resource resource;
    public SubThread(Resource resource){
        this.resource=resource;
    }
    @Override
    public void run(){


        for(int x=0;x<10;x++){

            try{
                this.resource.sub();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }

}

运行结果及报错内容

img

求帮忙解答一下,是jdk1.8新机制导致的吗

  • 写回答

3条回答 默认 最新

  • zcl_1991 2022-03-16 17:09
    关注

    要是哪个语言有这样的特性,那这语言早就死了;
    简单一点的改法 把if 换成while

    评论

报告相同问题?

问题事件

  • 修改了问题 3月16日
  • 修改了问题 3月16日
  • 修改了问题 3月16日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 依据报错在原代吗格式的基础上解决问题
  • ¥15 在虚拟机中安装flash code
  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?