2013-07-17 2 views
0

나는 데이터를 저장하고 블루투스를 통해 비동기 적으로 전송하는 arraylist를 보유하고 있습니다.자바 스레드 동시 읽기 및 쓰기

나는 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 Fail 메시지를 받았습니다. 나머지 데이터는 모두 새로 추가 된 AOK Fail 일 것입니다. 그 이유는 무엇입니까

스레딩 문제인 경우 모든 데이터가 전송 된 후에도 문제가 해결되지 않아야합니까?

+0

bufferList와 count는 어떻게 선언됩니까? 그것은 내가 볼 수있는 것에서 마치 그들이 제대로 동기화 된 것처럼 보이지 않습니다 ... –

답변

1

이 bufferList 변수는 스레드로부터 안전한 개체입니까? 배열 차단 목록 같은 거요? 그렇지 않으면 동시에 문제를 추가/제거하려는 데 문제가있을 수 있습니다.

이렇게하면 제작자 스레드에서 예외가 발생합니다. "Nothing to AOk"로그가 전송되지 않습니다.

1

그것은 몇 가지 세부 사항이 포함되어 있지 않기 때문에이 코드가 어떻게 작동하는지 매우 분명하지 않다 :

  • 당신은 어떻게 bufferList을 공급하고 그 유형은 무엇입니까? 어쩌면 귀하의 질문에 언급 한 ArrayList? ArrayList가 스레드 안전하지 않습니다. ArrayList documentation for Android을 참조하십시오.
  • write 방법은 무엇입니까?
  • 어떤 compareByte 메서드는 무엇입니까? 그것은 명백한 것처럼 보이지만 코드를 살펴 보는 것이 좋습니다 (대괄호가 누락 된 경우).
  • WriteThread 클래스 내부에서 사용하고있는 count var은 어디에 있습니까? 이 코드 외부에서 count 값을 증가시키고 계십니까? 사실이라면 count >= 3 (else 블록) 일 때 bufferList에서 모든 콘텐츠를 삭제할 수 있습니다. 그리고 이렇게하면 bufferList이 비어있어 잠시 동안 bufferList.isEmpty() == false && count < 3 상태의 첫 번째 부분이 거짓이 될 수 있습니다. else 블록을 실행하여 빈 ArrayList에서 요소를 제거하려고하면 코드가 IndexOutOfBoudsException을 던지고 (ArrayList remove method documentation 참조) WriteThread가 중단됩니다.
관련 문제