2013-07-17 299 views
0

我有一個arraylist存儲我收到的數據,並通過藍牙異步傳輸。Java線程併發讀取和寫入

我有一個寫線程和讀線程訪問該ArrayList。我試圖模擬藍牙回聲(藍牙是爲了迴應我發送的所有內容)。

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失敗。爲什麼會這樣

如果它是一個線程問題應該不是所有的數據後解決傳輸?

+0

如何bufferList和計數申報?從我所能看到的看來,它看起來並沒有看起來好像它們已經正確同步...... –

回答

1

這bufferList變量是線程安全的對象?像數組阻塞列表或什麼?如果不是,你可能會遇到一些問題,試圖同時添加/刪除它。

這會導致生產者線程異常,閒來無事將轉交你會得到「沒事AOK」的日誌。

1

這不是很清楚這個代碼是如何工作的,因爲它不包括一些細節:

  • 你是如何餵養bufferList並且是它的類型?也許你在你的問題中提到的ArrayList? ArrayList不是線程安全的,請參閱ArrayList documentation for Android
  • 什麼write方法呢?
  • 什麼compareByte方法呢?看起來很明顯,但是爲了以防萬一(也是你缺少一個括號),看看代碼是很好的。
  • 哪裏count VAR您使用WriteThread類中聲明?您是否在此代碼之外遞增count值?如果是這樣,則count >= 3(else塊)可能會從bufferList變量中刪除所有內容。如果你這樣做,你的bufferList.isEmpty() == false && count < 3條件的第一部分在某個時候可能是錯誤的,因爲你的bufferList將是空的;那麼你將執行else塊,試圖從一個空的ArrayList中移除一個元素,你的代碼將拋出一個IndexOutOfBoudsException(見ArrayList remove method documentation),你的WriteThread將被中止。