package com.bjsxt.d822.a2; public class SubThread9 extends Thread { /* * 當多個對象同時對同一個資源操做,則必須使用同步機制來控制。 * * 一、當方法去操做共享資源時,則該方法必須經過 synchronized關鍵字來修飾。 * 二、當方法被 synchronized 關鍵字修飾時,還須要 wait() 和 notify()兩個方法配合使用。 * wait()方法是讓當前線程對象進入等待狀態。 * notify()方法是讓當前線程對象對喚醒等待者。 */ private int sum = 0; @Override public synchronized void run() { String name = this.getName(); System.out.println( name + "統計員,開始統計了......."); for(int i = 1; i <= 100; i++ ){ sum += i; try { Thread.sleep( 100 ); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(name + "統計員,已將1至100的累加結果統計完畢。"); this.notify(); //喚醒等待者。 } //獲取sum的值。 //public int getSum() { public synchronized int getSum() { //犯過的錯誤:沒有寫synchronized來修飾getSum()方法,以致於出現了java.lang.IllegalMonitorStateException 異常 try { System.out.println( Thread.currentThread().getName() + " 經理在這兒等待結果........"); this.wait(); //等待 } catch (InterruptedException e) { } return sum; } }
package com.bjsxt.d822.a2; public class SubThread9Test { public static void main(String[] args) { System.out.println( Thread.currentThread().getName() + " 經理,開始工做了...... "); SubThread9 st = new SubThread9(); st.setName("張三"); st.start(); System.out.println( st.getName() + " 統計員,你能把1 + 2 + 3 + ... + 100 的結果給個人嗎?"); System.out.println("沒問題,但您須要等一下子。"); // try { // Thread.sleep( 15000 ); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } System.out.println("統計結果是: " + st.getSum() ); } }
由於在SubThread9類中getSum()沒有用synchronized 修飾,直接寫成 public int getSum(){} 而致使了異常java.lang.IllegalMonitorStateException的出現html