Java线程并发读写

标签 java android multithreading concurrency

我有一个数组列表,它存储我接收到的数据并通过蓝牙异步传输。

我有一个写入线程和一个读取线程来访问数组列表。我正在尝试模拟蓝牙回声(蓝牙是回声我发送的所有内容)。

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;
        }
    }
}
}

按下按钮后我将发送数据。如果我传输缓慢,效果很好。但是,当我开始快速单击(排队数据进行传输)时,它会失败。一旦我收到 AOK 失败消息。即使新添加数据,所有剩余数据也将全部 AOK Fail。为什么会这样

如果是线程问题,不是应该在所有数据传输后解决吗?

最佳答案

这个bufferList变量是线程安全对象吗?比如数组阻塞列表之类的?如果不是,您在尝试同时添加/删除项目时可能会遇到一些问题。

这会导致生产者线程中出现异常,不会传输任何其他内容,您会收到“Nothing to AOk”日志。

关于Java线程并发读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17700162/

相关文章:

java - HTTP 状态 404 – 未找到 : for controller - no view resolvers found in Idea

java - 查询用户输入,然后存储在数据库中,然后显示在页面上

java - 使用 Java 和 awt.Robot 时提高屏幕捕获速度

Android:无法启动 Activity 。 ClassCastException:android.Widget.Button

c# - 将位图从 Android 发送到笔记本电脑

java - 在同步方法中使用时的 hashmap 迭代器

javascript - 如果我向同一个网络 worker 发送多条消息,它是否将它们排队并按顺序处理它们?

java - http 请求在已部署的 Spring Boot 应用程序中如何工作?

java - 如何将当前 UTC 时间转换为 Unix 时间戳

c++ - std::condition_variable – 通知一次但等待线程被唤醒两次