2012-12-10 167 views
4

我有兩個線程。一個將音頻數據記錄到變量中。另一個線程將記錄的變量發送到服務器。由於我是多線程新手,因此在併發方面我需要做什麼?如何在兩個線程之間共享對象(線程同步)?

下面的代碼片段:

short[] sData = new short[1024]; 

recordingThread = new Thread(new Runnable() { 
     public void run() { 
      android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
      while (isRecording) { 
       recorder.read(sData, 0, BufferElements2Rec); 
      } 

     } 
    }, "AudioRecorder Thread"); 
    recordingThread.start(); 

而另一個線程正在接入同一SDATA並將其發送到服務器:

Thread sendThread= new Thread(new Runnable() { 
    public void run() { 
       android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
    while (true) { 
     try { 

     ByteBuffer.wrap(bData).order(ByteOrder.LITTLE_ENDIAN) 
      .asShortBuffer().put(sData);    
     } 
    } 
}); 
+0

你可能會將你的數組標記爲'最終靜態' – waqaslam

+0

應該使用Android上的AsyncTask: –

+1

@AndersMetnik通過使用AsyncTask需要更多的延遲。它的作品像1request = 1response。 –

回答

2

有兩個方面你的問題。

  • 假設sData是一個局部變量,所有你需要做的就是兩個線程共享的數組是聲明sDatafinal。 (如果sData是一個實例或類變量,你甚至都不需要做...)

  • 獲取兩個線程共享陣列安全是有點困難。問題是兩個線程需要同步。發送線程需要知道記錄線程寫入的數組部分。此外,需要同步來確保記錄線程寫入的數據對發送線程可見。

在這個例子中,正確的同步很可能需要一些額外的變量來指示兩個線程的當前位置。由於您必須處理一個線程需要等待另一個線程添加或發送數據的情況,因此您可能需要使用Object.wait()Object.notify()以避免繁忙的等待。


但你在語義層面都做得看起來好像它需要像short值的古典循環緩衝區工作。所以我建議尋找一個可以重用的現有實現。 (例如,如果你願意的Shortshort的開銷,那麼你可以使用一個ArrayBlockingQueue<Short>

+0

@Stephen ...是的,你是對的我必須使用wait()和notify()方法來擺脫這個問題 –

0

一個娃如果這是一次性操作,或者如果需要重複操作,則使用latch