0

「メイン」スレッドと実行可能スレッドの 2 つのスレッドを同期しようとしています。IllegalMonitorStateException が発生しますが、「オブジェクトのロックがありません」の意味が完全にはわかりません。

これが私のコードです:

public class ThreadsTest {
    private static ThreadsTest instance;
    public volatile boolean flag = false;

    public void doStuff() {
        System.out.println("first");

        this.flag = true;

    }

    public Runnable mDrawer = new Runnable() {

        public void run() {
            synchronized (ThreadsTest.getInstance()) {
                while (flag == false)
                    try {
                        wait();
                    } catch (InterruptedException ie) {
                        System.out.println("second");
                    }
            }



        }
    };

    public static ThreadsTest getInstance() {
        if (ThreadsTest.instance == null) {
            ThreadsTest.instance = new ThreadsTest();
        }
        return ThreadsTest.instance;
    }

    private ThreadsTest() {
    }

    public static void main(String[] args) {
        ThreadsTest t = ThreadsTest.getInstance();
        t.mDrawer.run();
        t.doStuff();

    }
}
4

1 に答える 1

2

wait()メソッドは、同期するオブジェクトに対してのみ呼び出すことができます。
だから、あなたが持っているのでsynchronized (ThreadsTest.getInstance())、あなたは書く必要がありますThreadsTest.getInstance().wait().

ここで何をテストしようとしているのか正確にはわかりません。基本的なスレッド同期のサンプルである場合は、コードを次のように変更する必要があります。

public class ThreadsTest {
    private static ThreadsTest instance;
    public volatile boolean flag = false;

    public void doStuff() {
        System.out.println("first");
        this.flag = true;
        synchronized (getInstance()) {
            getInstance().notifyAll();
        }
    }

    public Runnable mDrawer = new Runnable() {

        public void run() {
            synchronized (ThreadsTest.getInstance()) {
                while (flag == false)
                    try {
                        ThreadsTest.getInstance().wait();
                    } catch (InterruptedException ie) {
                        System.out.println("second");
                    }
            }



        }
    };

    public static ThreadsTest getInstance() {
        if (ThreadsTest.instance == null) {
            ThreadsTest.instance = new ThreadsTest();
        }
        return ThreadsTest.instance;
    }

    private ThreadsTest() {
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadsTest t = ThreadsTest.getInstance();
        new Thread(t.mDrawer).start();
        Thread.sleep(1000L); // let other thread start, so it won't skip our notify()
        t.doStuff();
    }
}
于 2010-09-22T21:39:12.543 に答える