隨筆-72  評論-20  文章-0  trackbacks-1
           
          1.wait、notify、notifyAll
          1)每一個對象除了有一個鎖之外,還有一個等待隊列(wait set),當(dāng)一個對象剛創(chuàng)建的時候,它的等待隊列是空的。
           
          2)wait,告訴當(dāng)前線程放棄監(jiān)視器并進入睡眠狀態(tài)(進入等待隊列),直到其他線程進入同一個監(jiān)視器并調(diào)用notify為止。
           
          3)當(dāng)調(diào)用對象的notify方法時,將從該對象的等待隊列中刪除一個任意選擇的線程,這個線程將再次成為可運行的線程。
           
          4)當(dāng)調(diào)用對象的notifyAll方法時,將從該對象的等待隊列中刪除所有等待的線程,這些線程將成為可運行的線程。
           
          5)wait、nitify、nitifyAll這三個方法只能在synchronized方法中調(diào)用。
           
          6)wait和notify主要用于producer-consumer這種關(guān)系中。
           
          2.producer-consumer
          class Test {
              public static void main(String[] args) {
                   Queue q = new Queue();
                   Producer p = new Producer(q);
                   Consumer c = new Consumer(q);
                   p.start();
                   c.start();
              }
          }
           
          class Producer extends Thread {
              Queue q;
           
              Producer(Queue q) {
                 this.q = q;
              }
           
              public void run() {
                   for (int i = 0; i < 10; i++) {
                     q.put(i);
                     System.out.println("Producer put " + i);
                   }
              }
          }
           
          class Consumer extends Thread {
              Queue q;
           
              Consumer(Queue q) {
                 this.q = q;
              }
           
              public void run() {
                   while (true) {
                     System.out.println("Consumer get " + q.get());
                   }
              }
          }
           
          class Queue {
              int value;
              boolean bFull = false;
           
              public synchronized void put(int i) {
                   if (!bFull) {
                     value = i;
                     bFull = true;
                     notify();
                   }
                   try {
                     wait();
                   } catch (Exception e) {
                     e.printStackTrace();
                   }
              }
           
              public synchronized int get() {
                 if (!bFull) {
                     try {
                        wait();
                     } catch (Exception e) {
                        e.printStackTrace();
                     }
                 }
                 bFull = false;
                 notify();
                 return value;
              }
          }
          結(jié)果:
          Producer put 0
          Consumer get 0
          Producer put 1
          Consumer get 1
          Consumer get 2
          Producer put 2
          Consumer get 3
          Producer put 3
          Consumer get 4
          Producer put 4
          Producer put 5
          Consumer get 5
          Consumer get 6
          Producer put 6
          Consumer get 7
          Producer put 7
          Consumer get 8
          Producer put 8
          Producer put 9
          Consumer get 9
           
          3.線程的終止
          3.1設(shè)置一個flag變量。
          public class ThreadLife {
              public static void main(String[] args){
                   ThreadTest t=new ThreadTest();
                   new Thread(t).start();
                   for(int i=0;i<100;i++){
                     if(i==50) t.stopThread();
                     System.out.println(Thread.currentThread().getName()
                            +" is running.");
                   }
              }
          }
           
          class ThreadTest implements Runnable{
              private boolean flagRun=true;
              public void stopThread(){
                   flagRun=false;
              }
              public void run(){
                   while(flagRun){
                     System.out.println(Thread.currentThread().getName()
                            +" is running.");
                   }
              }
          }
           
          3.2使用中斷
          使用interrupt()方法,會被wait方法的catch(InterruptedException)捕獲。
          import java.util.Timer;
          import java.util.TimerTask;
           
          class Blocked extends Thread{
              public Blocked(){
                   System.out.println("Starting Blocked");
                   start();
              }
              public void run(){
                 try{
                     synchronized(this){
                        wait();//Blocks
                     }
                 }catch(InterruptedException e){
                     System.out.println("Interrupted");
                 }
                 System.out.println("Exiting run()");
              }
          }
           
          public class Interrupt {
              static Blocked blocked=new Blocked();
              public static void main(String[] args){
                 new Timer(true).schedule(new TimerTask(){
                     public void run(){
                        System.out.println("Preparing to interrupt");
                        blocked.interrupt();
                        blocked=null;//to release it
                     }
                 }, 2000);//run() after 2000 milliseconds
              }
          }
           
           
          4.線程生命周期示意圖
           
          5.參考資料
          [1]Thinking in Java 3rd
          [2]孫鑫視頻
          [3]張孝祥,Java就業(yè)培訓(xùn)教程,清華大學(xué)出版社

          posted on 2007-08-19 05:14 前方的路 閱讀(2222) 評論(0)  編輯  收藏 所屬分類: Java技術(shù)
          主站蜘蛛池模板: 长白| 哈尔滨市| 河池市| 牟定县| 连南| 万载县| 临沂市| 绵竹市| 聂拉木县| 上思县| 曲靖市| 崇义县| 星子县| 望江县| 沧州市| 台湾省| 虞城县| 南陵县| 台南县| 宜昌市| 安丘市| 类乌齐县| 武陟县| 文化| 福鼎市| 临湘市| 贵阳市| 延边| 五家渠市| 新安县| 淮北市| 广东省| 佛学| 赤城县| 焉耆| 灵石县| 固阳县| 澎湖县| 聂拉木县| 蓬安县| 苏州市|