6

メインスレッドとワーカースレッドがあります。メイン スレッドがタスクをキューに追加し、ワーカー スレッドがタスクを受け取ってデータを計算します。オブジェクトをキューに入れる前に、タスク オブジェクト内のReentrantLock オブジェクト (メイン スレッド上) でロックを呼び出します。ワーカー スレッドがキューからのタスクの処理を終了したら、(ワーカー スレッドで) unlock を呼び出します。問題は、異なるスレッドでロックとロック解除を呼び出すため、IllegalMonitorStateException が発生することです。

別のスレッドでこれを実行できる代替ロック システムを探しています。

例:

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);
    }
}
4

3 に答える 3

0

質問によると、マルチスレッドアプリケーションを設計するのは正しい方法ではありません。

ワーカー スレッドでオブジェクトの作成を処理するか、不変オブジェクトをワーカー スレッドに渡し、ワーカー スレッドが終了したら、結果をメイン スレッドに返すことができます。

あるスレッドでロックを取得し、別のスレッドでロックを解除することは不可能だと思います。

于 2016-04-15T17:52:03.677 に答える