У меня есть основной поток и рабочий поток. Основной поток добавляет задачи в очередь, а рабочий поток принимает их для вычисления данных. Прежде чем помещать объекты в очередь, я вызываю блокировку объекта ReentrantLock (по основному потоку) внутри объектов задачи. Когда рабочий поток завершается работой над задачей из очереди, я вызываю разблокировку (на рабочий поток). Проблема в том, что я получаю исключение IllegalMonitorStateException, потому что я вызываю блокировку и разблокировку в разных потоках.Java lock and unlock on different thread
Я ищу альтернативную систему блокировки, где я могу это сделать на разных потоках.
Пример:
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);
}
}
Что вы пытаетесь защитить своей блокировкой? – Savior
@Pillar Данные внутри объектов. – stonar96
синхронизировать объект перед блокировкой и разблокировкой – ControlAltDel