Cómo compartir un objeto entre dos subprocesos (sincronización de subprocesos)?

Tengo dos hilos. Uno registra los datos de audio en la variable. Otro Thread envía esa variable grabada al servidor. ¿Qué debo hacer en términos de concurrencia, ya que soy nuevo en multi-threading?

A continuación se muestra el fragmento de código:

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(); 

Y otro hilo que está accediendo a la misma sData y enviándolo al servidor:

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

Hay dos aspectos a su pregunta.

  • Suponiendo que sData es una variable local, todo lo que necesita hacer para obtener los dos hilos para compartir la matriz es declarar sData como final . (Y si sData es una instancia o una variable de clase, ni siquiera necesita hacer eso …)

  • Obtener los dos hilos para compartir la matriz de forma segura es un poco más difícil. El problema es que los dos subprocesos necesitan sincronizarse. El subproceso de envío necesita saber qué parte de la matriz que el subproceso de registro ha escrito. Además, la sincronización es necesaria para asegurar que los datos escritos por el hilo de registro son visibles para el hilo de envío.

En este ejemplo, la sincronización apropiada implicará muy probablemente un par de variables extra para indicar las posiciones actuales de los dos subprocesos. Y puesto que usted tiene que ocuparse de los casos en que un hilo necesita esperar a que el otro agregue o envíe datos, usted necesita probablemente utilizar Object.wait() y Object.notify() para evitar la espera ocupada.


Pero lo que está haciendo en el nivel semántico parece que necesita funcionar como un buffer circular clásico de valores short . Así que te recomiendo que busques una implementación existente que puedas reutilizar. (Por ejemplo, si estuviera dispuesto a tomar la sobrecarga de Short versus short entonces podría usar un ArrayBlockingQueue<Short> ).

Para minimizar la reinvención de la rueda, se puede implementar como sincronización productor / consumidor. Para empezar:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ArrayBlockingQueue.html

Por si acaso, algunas cosas introductorias están aquí:

http://en.wikipedia.org/wiki/Producer-consumer_problem

Una forma de manejar esto es usar un pestillo si se trata de una operación única o de un CyclicBarrier si esto necesita ser repetido.

  • ¿Cómo funciona la sincronización de datos y cómo la uso en aplicaciones cliente-servidor?
  • Sincronizar dispositivos Android a través de la hora GPS?
  • Android: cómo recibir notificaciones cuando finaliza la sincronización, al solicitar una sincronización con ContentResolver.requestSync ()
  • Android sync strings.xml
  • Recuperación de llamada de Android SyncAdapter
  • Evitar que el servicio de fondo se destruya debido a "detectar una CPU excesiva en un proceso bifurcado"
  • Cómo mostrar el mensaje de error de sincronización
  • Sincronizar datos SQLite desde el teléfono Android a la base de datos MySQL de MySQL de Windows
  • sincronización del tiempo del emulador androide
  • ¿Cómo implementar la sincronización de datos entre dispositivos en línea y sin conexión con el motor de aplicaciones de Google?
  • Sincronizar varias ventanas con varias vistas en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.