Hallo zusammen,
ich habe ein Deadlock-Problem. Ich nutze eine Semaphore zu Verwaltung einer Liste, der aus einem Thread Items hinzugefügt werden können, ein anderer Thread liefert den aktuellen Status der Einträge (wenn der User "aktualisieren" drückt). Jetzt kann es zum Deadlock kommen, wenn ein Job angelegt wird und der User gleichzeitig aktualisiert. Mir ist nur leider nicht klar warum???:L
Exception wird keine geworfen, die System.outs enden mit: "A" und "Sperre" -> Beide warten auf das release()
Ich habe folgende Methoden in "main":
Aktualisieren:
Hinzufügen:
ich habe ein Deadlock-Problem. Ich nutze eine Semaphore zu Verwaltung einer Liste, der aus einem Thread Items hinzugefügt werden können, ein anderer Thread liefert den aktuellen Status der Einträge (wenn der User "aktualisieren" drückt). Jetzt kann es zum Deadlock kommen, wenn ein Job angelegt wird und der User gleichzeitig aktualisiert. Mir ist nur leider nicht klar warum???:L
Exception wird keine geworfen, die System.outs enden mit: "A" und "Sperre" -> Beide warten auf das release()
Ich habe folgende Methoden in "main":
Java:
public synchronized void addBatchjob(ItemBatchjob job) {
try {
System.out.println("A");
batchjobcontroller.acquire();
batchjobliste.add(job);
OutputStream fos = new FileOutputStream("batchjobliste.crm");
ObjectOutputStream o = new ObjectOutputStream(fos);
o.writeObject(batchjobliste);
} catch (Exception e) {
e.printStackTrace();
} finally {
batchjobcontroller.release();
System.out.println("R");
}
}
public synchronized void sperreBatchjobliste() {
try {
System.out.println("Sperre");
batchjobcontroller.acquire(); //batchjobcontroller: Binäre, faire Semaphore
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void oeffneBatchjobliste() {
try {
System.out.println("Öffne");
batchjobcontroller.release();
} catch (Exception e) {
e.printStackTrace();
}
}
Aktualisieren:
Java:
final DisabledGlassPane glass = new DisabledGlassPane();
JRootPane rootPane = SwingUtilities.getRootPane(fenster);
rootPane.setGlassPane(glass);
fenster.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
glass.activate("Bitte warten...");
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
synchronized (this) {
main.sperreBatchjobliste();
aktualisiereStatus(model);
main.oeffneBatchjobliste();
}
return null;
}
@Override
protected void done() {
glass.deactivate();
fenster.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
};
worker.execute();
Hinzufügen:
Java:
main.addBatchjob(new ItemBatchjob(...));
Zuletzt bearbeitet: