我有一個主線程和一個工作線程。主線程將任務添加到隊列中,並且工作線程使他們計算數據。在將對象放入隊列之前,我調用任務對象內的ReentrantLock對象(主線程上的)的鎖定。當工作線程完成處理隊列中的任務時,我會調用解鎖(工作線程上的)。問題是我得到一個IllegalMonitorStateException,因爲我在不同的線程上調用鎖定和解鎖。Java鎖和解鎖不同的線程
我正在尋找一個替代鎖定系統,我可以在不同的線程上做到這一點。
例子:
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