大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 舉例說明Java阻塞隊列

舉例說明Java阻塞隊列

更新時間:2022-10-17 12:52:31 來源:動力節點 瀏覽1378次

Java阻塞隊列這個,就是當隊列中沒有數據的時候,線程讀取的話會等待。當隊列中的數據滿的時候,線程添加數據的時候,也會等待。

有個例子很生動形象,往盤子里面放雞蛋,只能放固定數目的。盤子里面沒有雞蛋,無法從中拿出來。當盤子里滿了,也放不進去。直到被拿出去才能在放。

代碼如下,這里設置的是一個盤子最多放10個雞蛋:

package com.thread.two;
import java.util.ArrayList;
import java.util.List;
public class Plate {
    List<Object> eggs=new ArrayList<Object>();public synchronized Object getEgg(){while(eggs.size()==0){
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        Object egg=null;
        for (int i = 0; i < 10; i++) {
            egg=eggs.get(i);
            System.out.println("拿到雞蛋.........");
        }
        //Object egg=eggs.get(0);
        eggs.clear();
        notify();
        //System.out.println("拿到雞蛋.........");
        return egg;
    }    
    public synchronized void putEgg(Object egg){
while(eggs.size()>9){
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        eggs.add(egg);
        notify();
        System.out.println("放入雞蛋.........");
    }    
    static class AddThread extends Thread{
        private Plate plate;
        private Object egg=new Object();
        public AddThread(Plate plate){
            this.plate=plate;
        }
        public void run(){
            for (int i = 0; i < 1000; i++) {
                plate.putEgg(egg);
            }
        }
    }    
    static class GetThread extends Thread{
        private Plate plate;
        public GetThread(Plate plate){
            this.plate=plate;
        }
        public void run(){
            for (int i = 0; i < 1000; i++) {
                plate.getEgg();
            }
        }
    }    
    public static void main(String[] args) throws InterruptedException {
        Plate plate=new Plate();
        Thread add=new Thread(new AddThread(plate));
        Thread get=new Thread(new GetThread(plate));
        add.start();
        get.start();
        add.join();
        get.join();
        System.out.println("測試結束");
    }    
}

這個例子很形象,用線程實現了上面所說的。

java現在有concurrent包,里面有很多現成的可以用的類,很多是線程安全的,這樣,像上面寫的put或者get,都不需要自己寫同步方法了,這些類已經包裝好了。

這里有一個ArrayBlockingQueue的例子,和上面實現的差不多。

首先是兩個線程,分別是put和get。

ThreadPut:

package com.thread.three;
import java.util.concurrent.ArrayBlockingQueue;
public class ThreadPut implements Runnable{
    private ArrayBlockingQueue<String> abq=null;
    public ThreadPut(ArrayBlockingQueue<String> abq){
        this.abq=abq;
    }
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            System.out.println("要向隊列中存數據了");
            try {
                Thread.sleep(1000);
                abq.put("hi");
                System.out.println("存入后,數據一共為:"+abq.size());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

ThreadGet:

package com.thread.three;
import java.util.concurrent.ArrayBlockingQueue;
public class ThreadGet extends Thread {
    ArrayBlockingQueue<String> abq=null;
    public ThreadGet(ArrayBlockingQueue<String> abq){
        this.abq=abq;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("我要從隊列中取數據了");
            String msg=null;
            if (abq.size()>0) {
                msg=abq.remove();
            }
            System.out.println("隊列中取得的數據為:"+msg+",隊列中還有一共:"+abq.size());
        }
    }
}

測試類:

public class ArrayBlockQueueApp {    
    public static void main(String[] args) {
        ExecutorService  es=Executors.newCachedThreadPool();
        ArrayBlockingQueue<String> abq=new ArrayBlockingQueue<String>(10);
        ThreadGet tGet=new ThreadGet(abq);
        Thread tPut=new Thread(new ThreadPut(abq));
        es.execute(tGet);
        es.execute(tPut);
    }
}

這些隊列放消息的話挺不錯的。如果大家想了解更多相關知識,不妨來關注一下本站的Java隊列,里面還有更豐富的知識等著大家去學習,相信對大家一定會有所幫助的。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 欧美一级免费观看 | 国产精品视频免费在线观看 | 成人免费毛片一区二区三区 | 中文字幕在线免费看 | 99精品国产一区二区三区 | 999久久久国产 | 伊人国产精品 | 国产精品国产三级国产普通话 | 69美女福利视频在线观看 | 亚洲一区二区影院 | 欧美色老太婆 | 亚洲综合黄色 | 欧做爰xxxⅹ性欧美大片孕妇 | 激情亚洲综合网 | 狠狠色丁香婷婷久久综合不卡 | 国产福利观看 | 欧美一欧美一区二三区性 | 日本a在线| 国产国产人免费观看在线视频 | 色久阁 | 精品香蕉99久久久久网站 | 欧美成人在线免费视频 | 精品推荐 国产 | 亚洲国产精品日韩在线 | 欧美精品久久一区二区三区 | 日韩国产欧美成人一区二区影院 | 天天翘夜夜洗澡天天做 | 免费福利入口在线观看 | a免费网站 | 欧美成人另类bbw | 精品国产_亚洲人成在线高清 | 97视频在线观看免费视频 | 在线看日本吃奶孕交 | 国产亚洲欧美日韩综合另类 | 波多野结衣视频一区二区 | 精品欧美一区二区三区四区 | 国产成人久久精品 | 国产精品98视频全部国产 | 成年女人18毛片毛片免费 | 久操视频在线免费观看 | 久久精品蜜芽亚洲国产a |