You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java:如何将Buffer类处理的布尔值传递给Reader类

问题分析与修复方案

咱们先梳理下你代码里的几个核心问题,这些问题直接导致了你看到的布尔值异常以及逻辑不执行的情况:

1. setBool 方法未实际修改类变量

你的Buffer类里的setBool方法只是接收参数并返回,完全没有更新类里的private static boolean value变量:

public boolean setBool(boolean value) {
    boolean val = value;
    return val;
}

这就意味着不管你在read方法里调用多少次setBool(true/false),类里的value变量永远不会变化,后续getBool拿到的只是初始默认值,这肯定会导致逻辑混乱。

2. Reader的run方法存在死循环

你的run方法里的循环写法有问题:

while (k!=18) buffer.read(j);
j++;
k++;

这个while循环会一直重复调用buffer.read(j),因为循环内部没有修改k的值,k永远是0,所以循环永远不会退出,后面的j++、k++和getBool()代码根本不会执行到!

3. Reader中调用getBool的方式错误

Reader类里的boolean value = getBool();是直接调用,但getBool()是Buffer类的方法,你应该通过buffer.getBool()来调用。

4. 多线程下的变量可见性问题

因为Reader是实现了Runnable的多线程类,Buffer里的value变量如果是静态的,需要用volatile修饰来保证多线程之间的可见性,否则Reader可能看不到Buffer对value的修改。


修正后的完整代码

Buffer类

public class Buffer {
    // 用volatile保证多线程可见性
    private static volatile boolean value;

    public int read(int j) {
        // 这里替换成你的实际判断条件
        if (j % 2 == 0) {
            setBool(true);
        } else if (j % 3 == 0) {
            setBool(false);
        } else {
            setBool(true);
        }
        return 0;
    }

    // 实际修改类变量value
    public boolean setBool(boolean newValue) {
        value = newValue;
        return value;
    }

    // 获取当前的布尔值
    public boolean getBool() {
        return value;
    }
}

Reader类

public class Reader implements Runnable {
    private Buffer buffer;

    public Reader(Buffer buffer) {
        this.buffer = buffer;
    }

    @Override
    public void run() {
        int j = 0;
        int k = 0;
        // 把j++和k++放到循环内部,避免死循环
        while (k != 18) {
            buffer.read(j);
            // 获取当前的布尔值并处理
            boolean currentValue = buffer.getBool();
            System.out.println("当前布尔值:" + currentValue);
            j++;
            k++;
        }
    }
}

关键说明

  • setBool方法修正:现在它会真正更新类里的value变量,而不是只返回参数。
  • 循环逻辑修正:把j++和k++放到while循环内部,这样每次循环都会推进计数器,避免死循环,同时每次调用read后可以立即获取最新的布尔值。
  • 可见性保证:用volatile修饰value,确保当Buffer修改了这个值后,所有Reader线程都能立即看到最新的值。
  • 方法调用修正:通过buffer.getBool()正确调用Buffer类的方法来获取布尔值。

这样修改后,你就能正确在Reader中获取Buffer处理后的布尔值,不会再出现同时显示true和false的异常情况了。

内容的提问来源于stack exchange,提问作者Orihime_Orion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:27:38