Java线程并发读写
我有一个arraylist,它存储通过蓝牙异步接收和传输的数据 我有一个写线程和一个读线程来访问arraylist。我试图模拟蓝牙回声(蓝牙是回显我发送的所有内容)Java线程并发读写,java,android,multithreading,concurrency,Java,Android,Multithreading,Concurrency,我有一个arraylist,它存储通过蓝牙异步接收和传输的数据 我有一个写线程和一个读线程来访问arraylist。我试图模拟蓝牙回声(蓝牙是回显我发送的所有内容) 私有类ReadThread扩展线程{ @凌驾 公开募捐{ super.run(); 而(!isInterrupted()){ 试一试{ 字节[]缓冲区=新字节[64]; if(mInputStream==null)返回; size=mInputStream.read(缓冲区); 如果(大小==64){ if(bufferList.i
私有类ReadThread扩展线程{
@凌驾
公开募捐{
super.run();
而(!isInterrupted()){
试一试{
字节[]缓冲区=新字节[64];
if(mInputStream==null)返回;
size=mInputStream.read(缓冲区);
如果(大小==64){
if(bufferList.isEmpty()){
Log.i(“AOK失败”,“无需AOK”);
}
if(compareByte(buffer,bufferList.get(0)=true)//比较此2字节数组中的数据
bufferList.remove(0);
}
}捕获(IOE异常){
e、 printStackTrace();
返回;
}
}
}
}
私有类WriteThread扩展线程{
@凌驾
公开募捐{
super.run();
而(!isInterrupted()){
试一试{
计数++;
如果(bufferList.isEmpty()==false&&count<3){
写入(bufferList.get(0));
计数=0;
}否则{
//尝试3次失败后丢弃数据
bufferList.remove(0);
计数=0;
}
睡眠(500);
}捕获(IOE异常){
e、 printStackTrace();
返回;
}
}
}
}
按下按钮后,我将发送数据。如果传输速度慢,效果很好。但是,当我开始快速单击时,它会失败(传输数据队列)。一旦我收到AOK失败消息。所有剩余数据都将是AOK失败,即使是新添加的数据。为什么会这样
如果是线程问题,在传输所有数据后是否应该解决它?此bufferList变量是线程安全的对象?如数组阻止列表或其他什么?如果不是,则在尝试同时添加/删除iTen时可能会遇到一些问题
这将导致producer线程中出现异常,不会传输任何其他内容。您将获得“nothing to AOk”日志。这段代码的工作原理不太清楚,因为它不包含一些详细信息:
- 您如何输入
及其类型?可能是您在问题中提到的ArrayList?ArrayList不是线程安全的请参阅bufferList
方法做什么write
方法的作用是什么?这似乎很明显,但最好看一下代码,以防万一(另外,您缺少一个括号)compareByte
- 声明的WriteThread类内使用的
变量在哪里?是否在此代码外递增count
值?如果为真,则当count
时,您可能正在从count>=3
变量中删除所有内容(else块)。如果执行此操作,bufferList
条件的第一部分在某个时候可能为false,因为bufferList.isEmpty()==false&&count<3
将为空;然后执行else块,尝试从空的ArrayList中删除元素,代码将抛出IndexOutofBoodException(请参阅)您的WriteThread将被中止bufferList
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
while(!isInterrupted()) {
try {
byte[] buffer = new byte[64];
if (mInputStream == null) return;
size = mInputStream.read(buffer);
if (size == 64) {
if (bufferList.isEmpty()){
Log.i("AOK Fail","Nothing to AOK");
}
if (compareByte(buffer,bufferList.get(0) == true) // Compare data in this 2 byte array
bufferList.remove(0);
}
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}
private class WriteThread extends Thread {
@Override
public void run() {
super.run();
while(!isInterrupted()) {
try {
count++;
if (bufferList.isEmpty() == false && count < 3){
write(bufferList.get(0));
count = 0;
}else{
// Drop data after 3 fail attempt
bufferList.remove(0);
count=0;
}
Thread.sleep(500);
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}