<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 前方的路 閱讀(2227) 評論(0)  編輯  收藏 所屬分類: Java技術
    主站蜘蛛池模板: 涩涩色中文综合亚洲| 亚洲日韩精品无码专区加勒比| 亚洲日韩一页精品发布| 久久精品国产精品亚洲艾| 亚洲人成网站999久久久综合| 91精品免费久久久久久久久| 精品国产免费观看| 亚洲AV无码成人精品区在线观看| h视频在线免费观看| 国产精品美女午夜爽爽爽免费| 亚洲综合色视频在线观看| 亚洲三级在线视频| 国产一精品一av一免费爽爽| 国产精品国产免费无码专区不卡| 亚洲激情校园春色| 国产午夜成人免费看片无遮挡| 国产精品黄页在线播放免费| 国产偷国产偷亚洲清高APP| 1000部拍拍拍18勿入免费凤凰福利 | 曰韩无码AV片免费播放不卡| 亚洲精品在线免费观看视频| 国产成人精品日本亚洲专区61 | 亚洲精品综合久久中文字幕| 国产91免费视频| 亚洲成a∧人片在线观看无码| 免费在线观看h片| 亚洲精品无码久久久久秋霞| 亚洲日韩中文字幕日韩在线 | 最近最新中文字幕完整版免费高清| 亚洲国产综合精品中文字幕 | 2020国产精品亚洲综合网| 99在线观看免费视频| 超清首页国产亚洲丝袜| 香港一级毛片免费看| 大学生高清一级毛片免费| 亚洲一级高清在线中文字幕| 国产精品视频免费一区二区三区| 久久国产美女免费观看精品| 国产亚洲人成A在线V网站| 91免费在线播放| 免费无码午夜福利片|