hurtCat 2021-09-30 10:20 采纳率: 0%
浏览 47

java代码演示有序性问题,结果不符合预期

想用代码演示出并发的有序性问题,代码如下

public class ConCurrentTest {

    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        scheduledExecutorService.scheduleWithFixedDelay(()->{
            try {
                MyTest mt = new MyTest();
                CountDownLatch cd = new CountDownLatch(1);
                CountDownLatch cd1 = new CountDownLatch(2);
                executorService.execute(() -> {
                    try {
                        cd.await();
                        mt.test1();
                        cd1.countDown();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
                executorService.execute(() -> {
                    try {
                        cd.await();
                        mt.test2();
                        cd1.countDown();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
                cd.countDown();
                cd1.await();
                if (mt.getC() == 0) {
                    System.out.println("a="+mt.getA());
                    System.out.println("b="+mt.getB());
                    System.out.println("c="+mt.getC());
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        }, 1, 1, TimeUnit.SECONDS);

    }
}

class MyTest {
    private int a = 0;
    private boolean b = false;
    private int c = 0;
    public void test1(){
        a = 1;
        b = true;
    }
    public void test2(){
        while (!b);
        c = a;
    }
    public int getA() {
        return a;
    }
    public boolean getB() {
        return b;
    }
    public int getC() {
        return c;
    }
}

正常情况自然是a=1, c=1;
但应该也会出现a=1,c=0;的情况呀,我这始终没出现预期效果

  • 写回答

1条回答 默认 最新

  • Mrlw 2021-09-30 16:31
    关注

    跑了下你的代码,按我理解你想展示的意思是,
    最外面的定时线程池用来循环调用。
    里面线程池2个任务,执行方法前 同时被阻塞了
    然后运行cd.countDown(); 同时释放,
    然后cd1.await(); 阻塞,直到两个线程任务执行完

    至于ABC 01这些,只是用来展示执行顺序吧,源代码中的展示处理有问题,达不到你要的效果
    直接输出就好了,在test1、test2方法中直接System.out输出就可以了,偶尔能看到test2先执行

    评论

报告相同问题?

问题事件

  • 创建了问题 9月30日

悬赏问题

  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价