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:
- SyncAdapter no se llama dependiendo del orden de las llamadas de configuración de cuenta
- Sincronización de archivos y bases de datos de Android con Dropbox
- Utilizando un local_manifest.xml con repo
- Cómo sincronizar datos entre diferentes dispositivos
- Android - Cómo descargar los datos en segundo plano en determinados momentos
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); } } });
- Adaptador de sincronización sin cuenta
- API de copia de seguridad de Android
- Android Gradle Error: "Error al obtener el ID de la aplicación para depurar"
- Una solución en la nube para sincronizar la base de datos de aplicaciones en Android
- Sincronizar la hora del sistema en 2 teléfonos
- ¿Por qué Android activa una sincronización de cuenta de Google cada vez que agrego o elimino una cuenta de un tipo personalizado?
- ¿Cómo saber cuándo se termina la sincronización?
- ¿Cómo sincronizar la base de datos SQLite en el teléfono Android con la base de datos MySQL en el servidor?
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 declararsData
comofinal
. (Y sisData
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í:
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.
- Motorola Bionic – tipo de entrada textPersonName y textCapWords no funcionan
- Selector de Android con la duración de fundido / desvanecimiento inicialmente invisible