Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BlockingQueue与stringbuilder一起工作不正常_Java_Stringbuffer_Blockingqueue - Fatal编程技术网

Java BlockingQueue与stringbuilder一起工作不正常

Java BlockingQueue与stringbuilder一起工作不正常,java,stringbuffer,blockingqueue,Java,Stringbuffer,Blockingqueue,我试图将一组带有线程(比如thread1)的字符串排队到BlockingQueue中,并将这些排队的项目写入带有不同线程(thread2)的文件。一个简单的生产者-消费者问题 线程1: while(condition) { queue.add(data); } 线程2: while(true) { queue.take(data); //write the took data } 当数据为字符串时,整个操作运行良好。当我尝试对StringBuilder执行相同的操作时,结果是随机的 如果排队

我试图将一组带有线程(比如thread1)的字符串排队到BlockingQueue中,并将这些排队的项目写入带有不同线程(thread2)的文件。一个简单的生产者-消费者问题

线程1:

while(condition) { queue.add(data); }
线程2:

while(true) { queue.take(data); //write the took data }
当数据为字符串时,整个操作运行良好。当我尝试对StringBuilder执行相同的操作时,结果是随机的

如果排队的数据是“这是我的数据”,则输出是“y数据”或“是我的数据”或整个数据的某个随机子集(有时也是预期的整个数据)


阻塞队列的本质是这样对待stringBuilders,还是我做错了

字符串是不可变的,因此它是线程安全的,stringbuilder不是线程安全的,stringbuffer是线程安全的,也不要忘记在线程中添加适当的同步。在实际使用
stringbuilder
的地方显示代码如何?由于
StringBuilder
是可变的,我可以想象您的bug来自于重用相同的
StringBuilder
实例。无论如何,
BlockingQueue
在这里是无辜的。哇。谢谢@Kayaman。那是我的问题。我在重复使用StringBuilder。除了为每个数据创建新的StringBuilder之外,还有其他方法吗?为什么要使用
StringBuilder
?接收方是否打算向其添加更多数据?如果没有,请将其作为
字符串发送,您可以重用它(如果这对您很重要)。@Kayaman我可以使用该字符串。但每个数据都是唯一的,这将导致创建大量字符串。