zoukankan      html  css  js  c++  java
  • 利用Syschronized和wait,notify实现线程安全的阻塞队列

     1 class MQueue {
     2     
     3     private List<String> list = new ArrayList<String>();
     4     
     5     private int maxSize;
     6     
     7     private Object lock = new Object();
     8     
     9     public MQueue(int maxSize){
    10         this.maxSize=maxSize;
    11         System.out.println("线程"+Thread.currentThread().getName()+"已初始化长度为"+this.maxSize+"的队列");
    12     }
    13     
    14     public void put(String element){
    15         synchronized (lock) {
    16             if(this.list.size()==this.maxSize){
    17                 try {
    18                     System.out.println("线程"+Thread.currentThread().getName()+"当前队列已满put等待...");
    19                     lock.wait();
    20                 } catch (InterruptedException e) {
    21                     e.printStackTrace();
    22                 }
    23             }
    24             this.list.add(element);
    25             System.out.println("线程"+Thread.currentThread().getName()+"向队列中加入元素:"+element);
    26             lock.notifyAll(); //通知可以取数据
    27         }
    28     }
    29     
    30     public String take(){
    31         synchronized (lock) {
    32             if(this.list.size()==0){
    33                 try {
    34                     System.out.println("线程"+Thread.currentThread().getName()+"队列为空take等待...");
    35                     lock.wait();
    36                 } catch (InterruptedException e) {
    37                     e.printStackTrace();
    38                 }
    39             }
    40             String result = list.get(0);
    41             list.remove(0);
    42             System.out.println("线程"+Thread.currentThread().getName()+"获取数据:"+result);
    43             lock.notifyAll(); //通知可以加入数据
    44             return result;
    45         }
    46     }
    47 }
    48 
    49 public class DemoThread20 {
    50     public static void main(String[] args) {
    51         final MQueue q = new MQueue(5);
    52         
    53         new Thread(new Runnable() {
    54             @Override
    55             public void run() {
    56                 q.put("1");
    57                 q.put("2");
    58                 q.put("3");
    59                 q.put("4");
    60                 q.put("5");
    61                 q.put("6");
    62             }
    63         },"t1").start();
    64         
    65         new Thread(new Runnable() {
    66             @Override
    67             public void run() {
    68                 q.put("11");
    69                 q.put("21");
    70                 q.put("31");
    71                 q.put("41");
    72                 q.put("51");
    73                 q.put("61");
    74             }
    75         },"t2").start();
    76         
    77         new Thread(new Runnable() {
    78             @Override
    79             public void run() {
    80                 q.take();
    81                 q.take();
    82                 q.take();
    83                 q.take();
    84                 q.take();
    85             }
    86         },"t3").start();
    87         
    88         new Thread(new Runnable() {
    89             @Override
    90             public void run() {
    91                 q.take();
    92                 q.take();
    93                 q.take();
    94                 q.take();
    95                 q.take();
    96             }
    97         },"t4").start();
    98     }
    99 }
  • 相关阅读:
    想不明白为什么不复用老接口?
    dubbo入门教程-从零搭建dubbo服务
    使用Node.js时如何引入jQuery
    博客园在我的博客添加点击小心心特效
    博客园在微信内置浏览器打开时添加微信赞赏码功能
    Keepalived
    双网卡服务器使用指定网卡互通不同网段数据
    LNMP详解
    Centos7数据实时同步(Rsync+inotify)
    解决Centos7本机时间与实际时间相差8小时
  • 原文地址:https://www.cnblogs.com/xuzhiyuan/p/9263186.html
Copyright © 2011-2022 走看看