2

同じ種類のデータを処理するスレッドにロックを適用する必要があるコントローラー クラスを実装しています。したがって、このシナリオでは、ロックを適用および解放するための 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();
        }
    }
4

1 に答える 1