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
相关产品推荐
相关产品推荐

