4

私は2つのスレッドを持っています。音声データを変数に記録します。別のスレッドは、その記録された変数をサーバーに送信します。マルチスレッドは初めてなので、同時実行に関して何をする必要がありますか?

以下はコード スニペットです。

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

3 に答える 3

3

車輪の再発明を最小限に抑えるために、生産者/消費者の同期として実装できます。

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

念のため、いくつかの紹介をここに示します。

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

于 2012-12-10T09:50:07.887 に答える
2

あなたの質問には2つの側面があります。

  • がローカル変数であると仮定するとsData、配列を共有する 2 つのスレッドを取得するために必要なことは、sDataas として宣言することだけfinalです。(そしてsData、インスタンスまたはクラス変数である場合は、それを行う必要さえありません...)

  • 2 つのスレッドが配列を安全に共有するようにするのは少し難しいです。問題は、2 つのスレッドを同期する必要があることです。送信スレッドは、レコード スレッドが書き込んだ配列の部分を知る必要があります。さらに、記録スレッドによって書き込まれたデータが送信スレッドに見えるようにするために、同期が必要です。

この例では、適切な同期には、2 つのスレッドの現在の位置を示すために、いくつかの追加の変数が必要になる可能性が高くなります。また、一方のスレッドが他方のスレッドがデータを追加または送信するのを待機する必要がある場合に対処する必要があるため、ビジー状態の待機を回避するには、おそらくObject.wait()andを使用する必要があります。Object.notify()


しかし、セマンティック レベルで行っていることは、short値の古典的な循環バッファーのように動作する必要があるように見えます。したがって、再利用できる既存の実装を探すことをお勧めします。(たとえば、 vs のオーバーヘッドを考慮したい場合は、Shortshort使用できますArrayBlockingQueue<Short>。)

于 2012-12-10T09:36:15.547 に答える
0

これを処理する 1 つの方法は、これが 1 回限りの操作である場合はラッチを使用するか、これを繰り返す必要がある場合はCyclicBarrierを使用することです。

于 2012-12-10T10:03:41.700 に答える