Делать две вещи одновременно точно… сложно. В однопоточной среде ОС должна переключаться между потоками, чтобы имитировать их одновременную работу. Таким образом, чтобы иметь возможность запускать их «одновременно», вам нужно запустить два потока и дождаться, пока они достигнут точки, в которой они должны быть синхронизированы, а затем позволить обоим потокам теперь, когда они должны продолжить.
Другим решением было бы объединить два звуковых потока так, чтобы это звучало так, как если бы играли два звука, а на самом деле это один. Хотя я не настолько разбираюсь в управлении звуком, и уж точно не на Android ...
Решение для первого - создать два потока, запустить их оба, а затем использовать wait()
и notify()
, чтобы заставить их одновременно вызывать MediaPlayer.start()
, возможно, с помощью Заблокировать класс.
Итак, длинный пример того, как синхронизировать два потока (на основе примера здесь:
import java.util.concurrent.locks.*;
class SynchronizeTest implements Runnable {
public static void main(String[] args) {
final ReentrantLock lock = new ReentrantLock();
final Condition cond = lock.newCondition();
new Thread(new SynchronizeTest(1, lock, cond)).start();
new Thread(new SynchronizeTest(2, lock, cond)).start();
}
private final int number;
private final ReentrantLock lock;
private final Condition cond;
public SynchronizeTest(int number, ReentrantLock lock, Condition cond) {
this.number = number;
this.lock = lock;
this.cond = cond;
}
public void run() {
try {
if (number == 1) {
put();
}
else {
take();
}
}
catch (InterruptedException ie) { }
}
public void put() throws InterruptedException {
lock.lock();
try {
cond.await();
} finally {
lock.unlock();
}
System.out.println(number);
}
public void take() throws InterruptedException {
lock.lock();
// wait for put to take the lock
Thread.sleep(300);
try {
cond.signal();
} finally {
lock.unlock();
}
System.out.println(number);
}
}
Вероятно, это можно закодировать намного проще, но в последнее время я не так много кодировал на Java .. :-(
person
Patrick
schedule
03.12.2010