[英]How to share an object between threads to demonstrate that it is not thread-safe?
[英]How to Share a Object between two threads (Thread Synchronization)?
我有两个主题。 一个人将音频数据记录到变量中。 另一个线程将记录的变量发送到服务器。 由于我不熟悉多线程,因此我需要在并发性方面做些什么?
以下是代码段:
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);
}
}
});
为了最大限度地减少重新发明轮子,您可以将其实现为生产者/消费者同步。对于初学者:
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ArrayBlockingQueue.html
以防万一,一些介绍性的东西在这里:
你的问题有两个方面。
假设sData
是一个局部变量,你需要做的就是让两个Threads共享数组是将sData
声明为final
。 (如果sData
是一个实例或类变量,你甚至不需要这样做......)
让两个线程安全地共享阵列有点困难。 问题是两个线程需要同步。 发送线程需要知道记录线程写入的数组的哪个部分。 此外,同步是必要的,以确保记录线程写入的数据对发送线程可见。
在这个例子中,正确的同步很可能需要一些额外的变量来指示两个线程的当前位置。 而且由于您必须处理一个线程需要等待另一个线程添加或发送数据的情况,您可能需要使用Object.wait()
和Object.notify()
来避免繁忙等待。
但是你在语义层面上所做的事情看起来好像需要像short
值的经典循环缓冲区一样运行。 所以我建议您寻找可以重复使用的现有实现。 (例如,如果您愿意承担Short
与short
的开销,那么可以使用ArrayBlockingQueue<Short>
。)
处理此问题的一种方法是使用锁存器(如果这是一次性操作)或CyclicBarrier(如果需要重复)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.