如何在两个线程之间共享对象(线程同步)?

时间:2012-12-10 09:16:06

标签: java android multithreading 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);            
        }
    }
});

3 个答案:

答案 0 :(得分:3)

为了最大限度地减少重新发明轮子,您可以将其实现为生产者/消费者同步。对于初学者:

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

以防万一,这里有一些介绍性内容:

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

答案 1 :(得分:2)

您的问题有两个方面。

  • 假设sData是一个局部变量,要让两个线程共享数组,您需要做的就是将sData声明为final。 (如果sData是实例或类变量,您甚至不需要这样做......)

  • 让两个线程安全地共享数组 有点困难。问题是两个线程需要同步。发送线程需要知道记录线程写入的数组的哪个部分。此外,必须进行同步以确保记录线程写入的数据对发送线程可见。

在这个例子中,正确的同步很可能需要一些额外的变量来指示两个线程的当前位置。由于您必须处理一个线程需要等待另一个线程添加或发送数据的情况,您可能需要使用Object.wait()Object.notify()来避免繁忙等待。


但是你在语义层面上所做的事情看起来好像需要像short值的经典循环缓冲区一样运行。所以我建议您寻找可以重复使用的现有实现。 (例如,如果您愿意承担Shortshort的开销,那么您可以使用ArrayBlockingQueue<Short>。)

答案 2 :(得分:0)

处理此问题的一种方法是使用latch(如果这是一次性操作)或CyclicBarrier(如果需要重复)。