J'essaie d'utiliser notify() et wait(). Voici ma classe désirée. J'ai un problème, quand j'essaie d'appeler addNewItem()
. Si j'appelle le tryToReadItem()
d'abord, puis appelez la méthode addNewItem()
, ce journal ne sera pas imprimé. Notez que mon DemoClass
est le singleton.La méthode notify() d'Android n'est pas appelée
public class DemoClass {
private static final String TAG = "DemoClass";
private static DemoClass instance;
private Object lock = new Object();
private static Thread executor;
private static Runnable reader;
static MyQueue queue;
private DemoClass() {
queue = MyQueue.getInstance();
reader = new Runnable() {
@Override
public void run() {
tryToReadRequest();
}
};
}
public static DemoClass getInstance() {
if (null == instance) {
instance = new RequestExecutor();
executor = new Thread(reader);
executor.run();
}
return instance;
}
public boolean addNewItem() {
synchronized (lock) {
lock.notify(); // executor will be run
Log.i(TAG, "executor run...");
}
return true;
}
public void tryToReadItem() {
try {
while (true) {
synchronized (lock) {
if (queue.checkTopValue() == null) {
Log.v(TAG, "queue is empty");
lock.wait();
} else {
//TODO other code...
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
est ici l'utilisation de cette classe:
DemoClass executor = DemoClass.getInstance();
boolean bool = executor.addNewItem();
Suis-je manque quelque chose?
Modifier: Je viens de changer mon code. Maintenant tryToReadRequest()
est exécuté en continu alors que la file d'attente n'est pas vide. mais mon problème est que la ligne lock.notify();
ne s'exécute pas.
Tout est dans le même fil. Il devrait y avoir un autre thread impliqué. – Enzokie
Je suppose que si vous changez notifier à notifyAll vous avez le même résultat, non? – DEADMC
Ce n'est pas lié à votre problème, mais pour un singleton correct, vous avez besoin d'un bloc synchronisé dans getInstance() et e.printStackTrace(); ne fonctionne pas dans Android, vous devez écrire Log.e ("tag", Log.getStackTraceString (e)) à la place – DEADMC