同じ種類のデータを処理するスレッドにロックを適用する必要があるコントローラー クラスを実装しています。したがって、このシナリオでは、ロックを適用および解放するための 2 つのクラスを作成しました。
今、私は IllegalMonitorStateException 例外を取得しています。私は現在、別のスレッドのモニターにいることを知っています。
これはロック機構です:
ConcurrentHashMap<String, Thread> Map = new ConcurrentHashMap<String, Thread>();
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
final Object lock = new Object();
for (Thread thread : threadSet) {
StringBuffer sb = new StringBuffer(thread.getName().toString());
if ((sb.length() == 22) && (sb.toString().matches("[0-9]+"))
&& (thread != Thread.currentThread())) {
utiMap.put(thread.getName().toString(), thread);
}
}
synchronized (lock) {
if (utiMap.containsKey(key)) {
try {
lock.wait();
} catch (InterruptedException e) {
lock.notifyAll();
}
}
}
以下は、ロック解除ロジックです。
ConcurrentHashMap<String, Thread> Map = new ConcurrentHashMap<String, Thread>();
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Object lock = new Object();
for (Thread thread : threadSet) {
StringBuffer sb = new StringBuffer(thread.getName().toString());
if ((sb.length() == 22) && (sb.toString().matches("[0-9]+"))
&& (thread != Thread.currentThread()) && thread.getState().name().equals("WAITING")) {
utiMap.put(thread.getName().toString(), thread);
System.out.println("I am in controller Release -- ");
thread.resume();
}
}