<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-72  評論-20  文章-0  trackbacks-1
     
    1.wait、notify、notifyAll
    1)每一個對象除了有一個鎖之外,還有一個等待隊列(wait set),當一個對象剛創建的時候,它的等待隊列是空的。
     
    2)wait,告訴當前線程放棄監視器并進入睡眠狀態(進入等待隊列),直到其他線程進入同一個監視器并調用notify為止。
     
    3)當調用對象的notify方法時,將從該對象的等待隊列中刪除一個任意選擇的線程,這個線程將再次成為可運行的線程。
     
    4)當調用對象的notifyAll方法時,將從該對象的等待隊列中刪除所有等待的線程,這些線程將成為可運行的線程。
     
    5)wait、nitify、nitifyAll這三個方法只能在synchronized方法中調用。
     
    6)wait和notify主要用于producer-consumer這種關系中。
     
    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;
        }
    }
    結果:
    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設置一個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就業培訓教程,清華大學出版社

    posted on 2007-08-19 05:14 前方的路 閱讀(2219) 評論(0)  編輯  收藏 所屬分類: Java技術
    主站蜘蛛池模板: rh男男车车的车车免费网站| 久久精品国产亚洲AV| a级成人毛片免费视频高清| 亚洲国产精品人人做人人爽| 久久久亚洲精华液精华液精华液 | 亚洲成人免费在线| 国产综合免费精品久久久| 国产亚洲精品无码专区| 成人无码视频97免费| 亚洲成在人线av| 国产91免费视频| 久久久国产亚洲精品| 国产一精品一aⅴ一免费| 免费无遮挡无遮羞在线看| 国产亚洲一区二区三区在线不卡| 香蕉免费在线视频| 亚洲最大的成网4438| 欧美日韩国产免费一区二区三区 | 亚洲一区二区三区无码影院| 亚洲黄片手机免费观看| 亚洲AV无码久久精品狠狠爱浪潮| 精品无码AV无码免费专区| 亚洲中文字幕久久精品蜜桃| 四虎免费永久在线播放| 中文毛片无遮挡高清免费| 亚洲老熟女@TubeumTV| 国产男女猛烈无遮挡免费视频网站 | 女人18毛片水最多免费观看| 免费一级毛suv好看的国产网站| 亚洲成A人片777777| 成熟女人牲交片免费观看视频| 免费无码一区二区| 亚洲精品国产福利在线观看| 最新69国产成人精品免费视频动漫 | 1000部啪啪未满十八勿入免费| 亚洲男人的天堂网站| 久久久久国产成人精品亚洲午夜| 69av免费视频| 亚欧乱色国产精品免费视频| 亚洲国产综合人成综合网站00| 亚洲国产成人精品91久久久 |