/*
 * waitとnotifyの動作を確認するためのプログラム。
 */
/**
 * プログラム実行用メインクラス
 */
class MyWait {
    public static void main(String[] args) {
        MyWaitClass mwc = new MyWaitClass(); //<--- MyWaitClassオブジェクト作成。
        MyWaitThread mwt1 = new MyWaitThread(mwc,1); //<--- スレッド１作成。
        MyWaitThread mwt2 = new MyWaitThread(mwc,2); //<--- スレッド２作成。

        System.out.println("*** メイン開始 ***");

        try {
            mwt1.start();       //<--- スレッド１を実行。
            Thread.sleep(3000); //<--- 3秒待つ。
            mwt2.start();       //<--- スレッド２を実行。
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        System.out.println("*** メイン終了 ***");
    }
}
/**
 * synchronize文で使用するためのオブジェクト
 */
class MyWaitClass {
}

/**
 * Threadクラスのサブクラスを定義
 */
class MyWaitThread extends Thread {
    MyWaitClass myclass; // コンストラクタで指定されるMyWaitClassオブジェクト
    int flag = 0;        // と、スレッド識別用のフラグを保持するための変数。

    /** コンストラクタ */
    public MyWaitThread(MyWaitClass msc, int f) {
        myclass = msc;
        flag = f;
    }

    /**
     * run メソッドをオーバーライド
     */
    public void run() {
        synchronized( myclass ) { //<--- 排他処理を指定する。
            try {
			   	//----演習問題3runメソッドのオーバライド部分(try文の中のみ)を作成せよ-----//
				/*
				ヒント
				・flag==1の時wait
				・flag==2の時notify
				・出力結果が分かりやすくなるよう、適宜print文を入れよ
				*/
               }
            } catch( Exception ex ) {
                ex.printStackTrace();
            }
        }
    }
}

