Ich habe ein Haupt-Thread und ein Worker-Thread. Der Haupt-Thread fügt Aufgaben in eine Warteschlange ein, und der Worker-Thread nimmt sie zur Berechnung von Daten auf. Bevor ich die Objekte in die Warteschlange bringe, rufe ich ein ReentrantLock-Objekt (im Haupt-Thread) innerhalb der Aufgabenobjekte auf. Wenn der Arbeitsthread mit der Bearbeitung einer Aufgabe aus der Warteschlange fertig ist, rufe ich die Entsperrung auf (im Worker-Thread). Das Problem ist, dass ich eine IllegalMonitorStateException bekomme, weil ich Sperren und Entsperren auf verschiedenen Threads aufrufen.Java lock und entsperren auf anderen Thread
Ich bin auf der Suche nach einem alternativen Schloss-System, wo ich dies auf verschiedenen Threads tun kann.
Beispiel:
public class Worker extends Thread {
public static Queue<Task> tasks = new ConcurrentLinkedQueue<Task>();
@Override
public void run() {
while (true) {
Task task = tasks.poll();
if (task != null) {
task.work();
task.lock.unlock(); // Here is the unlock, Task#i should not change up to now
}
}
}
}
public class Task {
private int i = 0;
public Lock lock;
public void setI(int i) {
lock.lock();
this.i = i;
lock.unlock();
}
public void work() {
System.out.println(i);
}
}
public class Test {
Task task = new Task();
public void addTask() {
task.lock.lock(); // Here is the lock, Task#i should not change
Worker.tasks.add(task);
}
}
Was möchten Sie mit Ihrem Schloss schützen? – Savior
@Pillar Daten in den Objekten. – stonar96
synchronisieren auf dem Objekt vor dem Sperren und Entsperren – ControlAltDel