Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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线程并发读写_Java_Android_Multithreading_Concurrency - Fatal编程技术网

Java线程并发读写

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

我有一个arraylist,它存储通过蓝牙异步接收和传输的数据

我有一个写线程和一个读线程来访问arraylist。我试图模拟蓝牙回声(蓝牙是回显我发送的所有内容)

私有类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”日志。

这段代码的工作原理不太清楚,因为它不包含一些详细信息:

  • 您如何输入
    bufferList
    及其类型?可能是您在问题中提到的ArrayList?ArrayList不是线程安全的请参阅
  • write
    方法做什么
  • compareByte
    方法的作用是什么?这似乎很明显,但最好看一下代码,以防万一(另外,您缺少一个括号)
  • 声明的WriteThread类内使用的
    count
    变量在哪里?是否在此代码外递增
    count
    值?如果为真,则当
    count>=3
    时,您可能正在从
    bufferList
    变量中删除所有内容(else块)。如果执行此操作,
    bufferList.isEmpty()==false&&count<3
    条件的第一部分在某个时候可能为false,因为
    bufferList
    将为空;然后执行else块,尝试从空的ArrayList中删除元素,代码将抛出IndexOutofBoodException(请参阅)您的WriteThread将被中止

bufferList和count是如何声明的?从我所看到的情况来看,它们似乎没有正确同步。。。
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;
        }
    }
}
}