首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java线程并发读写

Java线程并发读写
EN

Stack Overflow用户
提问于 2013-07-17 20:47:15
回答 2查看 652关注 0票数 0

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

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

代码语言:javascript
复制
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失败,即使是新添加的数据。为什么会这样呢?

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

EN

回答 2

Stack Overflow用户

发布于 2013-07-17 21:11:51

此bufferList变量是线程安全对象吗?就像数组阻止列表之类的?如果不是,您可能在尝试同时添加/删除itens时遇到一些问题。

这将在生产者线程中导致异常,不会传输任何其他内容,您将获得"Nothing to AOk“日志。

票数 1
EN

Stack Overflow用户

发布于 2013-07-18 22:04:09

不太清楚这段代码是如何工作的,因为它没有包含一些细节:

  • 你是如何喂养bufferList的,它的类型是什么?也许就是你在问题中提到的ArrayList?ArrayList不是线程安全的请看ArrayList documentation for Android.
  • What write方法做什么?
  • compareByte方法做什么?这看起来很明显,但最好还是看一下代码,以防万一(另外,您还遗漏了一个bracket).
  • Where是否在WriteThread类中声明了您正在使用的count变量?您是否在此代码之外递增count值?如果这是真的,那么当count >= 3 (else块)时,您可能会从bufferList变量中删除所有内容。如果你这样做了,你的bufferList.isEmpty() == false && count < 3条件的第一部分有时可能是假的,因为你的bufferList将是空的;然后你将执行else块,试图从一个空的ArrayList中删除一个元素,你的代码将抛出一个IndexOutOfBoudsException (参见ArrayList remove method documentation),你的WriteThread将被中止。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17700162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档