1. 程式人生 > >執行緒習題練習

執行緒習題練習

java.lang.IllegalMonitorStateException

以為呼叫執行緒的wait,notify函式的時候 沒有在同步塊內,新增同步鎖synchronized可以了

練題1:編寫程式實現,子執行緒迴圈3次,接著主執行緒迴圈5次,接著再子執行緒迴圈3次,主執行緒迴圈5次,如此反覆

/**
 * 編寫程式實現,子執行緒迴圈3次,接著主執行緒迴圈5次,接著再子執行緒迴圈3次,主執行緒迴圈5次,如此反覆,迴圈3次.
 * wait和notify配合synchronized(obj)使用的。
 * 然後呼叫鎖的物件obj的wait方法,此時此執行緒處於等待狀態然後執行緒的鎖被釋放掉這個執行緒處於等待狀態,這是另外一個鎖這個物件的執行緒獲得鎖的物件   * 可以呼叫notify方法喚醒被鎖的執行緒,但是此時這個鎖還沒被釋放知道這個鎖內的方法執行完畢。但是這個notify方法喚醒是隨機喚醒的
 */
public class ThreadTest1 {
	public static Boolean isExc = true;

	public static void main(String[] args) {
		Object obj;
		final ThreadTest1 t1 = new ThreadTest1();
		Runnable run = new Runnable() {
			@Override
			public void run() {
				synchronized(t1)  { 
					for (int i = 1; i <= 3; i++) {
						if (!isExc) {
							try {
								System.out.println("子執行緒等待");
								t1.wait();
								System.out.println("子執行緒喚醒");
								i = 1;
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
						System.out.println("子執行緒迴圈:" + i);
						if (i == 3) {
							t1.notify();
							isExc = false;
							i=1;
						}
					}
				}
			}
		};

		Thread t = new Thread(run);
		t.start();

		while (true) {
			synchronized (t1) {
				for (int j = 1; j <= 5; j++) {
					if (isExc) {
						try {
							System.out.println("主執行緒等待");
							t1.wait();
							System.out.println("主執行緒喚醒");
							j = 1;
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}

					System.out.println("主執行緒迴圈:" + j);
					if (j == 5) {
						t1.notify();
						isExc = true;
						j=1;
					}
				}