目次
スタック
キュー
ブロッキング キュー
リーリー
ホームページ Java &#&チュートリアル Java スタックとキュー インスタンスの分析

Java スタックとキュー インスタンスの分析

May 10, 2023 pm 04:40 PM
java

    スタック

    package com.yuzhenc.collection;
    
    import java.util.Stack;
    
    /**
     * @author: yuzhenc
     * @date: 2022-03-20 15:41:36
     * @desc: com.yuzhenc.collection
     * @version: 1.0
     */
    public class Test26 {
        public static void main(String[] args) {
            Stack<String> stack = new Stack<>();
            stack.add("A");
            stack.add("B");
            stack.add("C");
            stack.add("D");
            System.out.println(stack);//[A, B, C, D]
            //判断栈是否为空
            System.out.println(stack.empty());//false
            //查看栈顶元素,不会移除
            System.out.println(stack.peek());//D
            System.out.println(stack);//[A, B, C, D]
            //查看栈顶元素,并且移除,即出栈(先进后出)
            System.out.println(stack.pop());//D
            System.out.println(stack);//[A, B, C]
            //入栈,和add方法执行的功能一样,就是返回值不同
            System.out.println(stack.push("E"));//返回入栈的元素 E
            System.out.println(stack);//[A, B, C, E]
        }
    }
    ログイン後にコピー

    キュー

    ブロッキング キュー

    • ArrayBlockingQueue : 同時読み取りおよび書き込み操作はサポートされていません。最下層は配列に基づいています。

    • LinkedBlockingQueue: 同時読み取りおよび書き込み操作をサポートし、同時実行時の効率が高くなります。条件、最下層はリンク リストに基づいています ;

    package com.yuzhenc.collection;
    
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author: yuzhenc
     * @date: 2022-03-20 16:00:22
     * @desc: com.yuzhenc.collection
     * @version: 1.0
     */
    public class Test27 {
        public static void main(String[] args) throws InterruptedException {
            ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<>(3);
            //添加元素
            //不可以添加null,报空指针异常
            //arrayBlockingQueue.add(null);
            //arrayBlockingQueue.offer(null);
            //arrayBlockingQueue.put(null);
    
            //正常添加元素
            System.out.println(arrayBlockingQueue.add("Lili"));//true
            System.out.println(arrayBlockingQueue.offer("Amy"));//true
            arrayBlockingQueue.put("Nana");//无返回值
    
            //队列满的情况下添加元素
            //arrayBlockingQueue.add("Sam");//报非法的状态异常
            //设置最大注阻塞时间,如果时间到了队列还是满的,就不再阻塞了
            arrayBlockingQueue.offer("Daming", 3,TimeUnit.SECONDS);
            System.out.println(arrayBlockingQueue);//[Lili, Amy, Nana]
            //真正阻塞的方法,如果队列一直是满的,就一直阻塞
            //arrayBlockingQueue.put("Lingling");//运行到这永远走不下去了,阻塞了
    
            //获取元素
            //获取队首元素不移除
            System.out.println(arrayBlockingQueue.peek());//Lili
            //出队,获取队首元素并且移除
            System.out.println(arrayBlockingQueue.poll());//Lili
            System.out.println(arrayBlockingQueue);//[Amy, Nana]
            //获取队首元素,并且移除
            System.out.println(arrayBlockingQueue.take());//Amy
            System.out.println(arrayBlockingQueue);//[Nana]
    
            //清空元素
            arrayBlockingQueue.clear();
            System.out.println(arrayBlockingQueue);//[]
    
            System.out.println(arrayBlockingQueue.peek());
            System.out.println(arrayBlockingQueue.poll());
            //设置阻塞事件,如果队列为空,返回null,时间到了以后就不阻塞了
            System.out.println(arrayBlockingQueue.poll(2,TimeUnit.SECONDS));
            //真正的阻塞,队列为空
            //System.out.println(arrayBlockingQueue.take());//执行到这里走不下去了
        }
    }
    ログイン後にコピー

    SynchronousQueue: キュー内でデータ競合を引き起こすことなく、スレッド間でデータを便利かつ効率的に転送します。

    package com.yuzhenc.collection;
    
    import java.util.concurrent.SynchronousQueue;
    
    /**
     * @author: yuzhenc
     * @date: 2022-03-20 21:06:47
     * @desc: com.yuzhenc.collection
     * @version: 1.0
     */
    public class Test28 {
        public static void main(String[] args) {
            SynchronousQueue sq = new SynchronousQueue();
            //创建一个线程,取数据:
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true){
                        try {
                            System.out.println(sq.take());
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
            //搞一个线程,往里面放数据:
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        sq.put("aaa");
                        sq.put("bbb");
                        sq.put("ccc");
                        sq.put("ddd");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
    ログイン後にコピー

    • PriorityBlockingQueue: 優先ブロッキング キュー;

    • 無制限のキュー、長さ制限なし、ただし長さを指定しない場合、デフォルトの初期長は 11 で、手動で指定することもできます。もちろん、データが追加され続けると、最下層 (最下層は配列 Object[]) が自動的に拡張されます。プログラムはすべて終了するまで終了しません。メモリが消費され、OutOfMemoryError メモリ オーバーフローが発生します。

    • Null 要素は配置できず、比較できないオブジェクトは許可されません (結果として

      ClassCastException がスローされます)。オブジェクトは内部コンパレータまたは外部コンパレータを実装する必要があります;

    • package com.yuzhenc.collection;
      
      import java.util.concurrent.PriorityBlockingQueue;
      
      /**
       * @author: yuzhenc
       * @date: 2022-03-20 21:16:56
       * @desc: com.yuzhenc.collection
       * @version: 1.0
       */
      public class Test29 {
          public static void main(String[] args) throws InterruptedException {
              PriorityBlockingQueue<Human> priorityBlockingQueue = new PriorityBlockingQueue<>();
              priorityBlockingQueue.put(new Human("Lili",25));
              priorityBlockingQueue.put(new Human("Nana",18));
              priorityBlockingQueue.put(new Human("Amy",38));
              priorityBlockingQueue.put(new Human("Sum",9));
              //没有按优先级排列
              System.out.println(priorityBlockingQueue);//[Human{name=&#39;Sum&#39;, age=9}, Human{name=&#39;Nana&#39;, age=18}, Human{name=&#39;Amy&#39;, age=38}, Human{name=&#39;Lili&#39;, age=25}]
              //出列的时候按优先级出列
              System.out.println(priorityBlockingQueue.take());//Human{name=&#39;Sum&#39;, age=9}
              System.out.println(priorityBlockingQueue.take());//Human{name=&#39;Nana&#39;, age=18}
              System.out.println(priorityBlockingQueue.take());//Human{name=&#39;Lili&#39;, age=25}
              System.out.println(priorityBlockingQueue.take());//Human{name=&#39;Amy&#39;, age=38}
          }
      }
      
      class Human implements Comparable <Human> {
          String name;
          int age;
      
          public Human() {}
      
          public Human(String name, int age) {
              this.name = name;
              this.age = age;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      
          @Override
          public String toString() {
              return "Human{" +
                      "name=&#39;" + name + &#39;\&#39;&#39; +
                      ", age=" + age +
                      &#39;}&#39;;
          }
      
          @Override
          public int compareTo(Human o) {
              return this.age-o.age;
          }
      ログイン後にコピー
    • DelayQueue: DelayQueue は無制限の BlockingQueue、 Delayed インターフェイスを実装するオブジェクトを配置するために使用され、オブジェクトは有効期限が切れたときにのみキューから取得できます。

    • プロデューサー スレッドが put などのメソッドを呼び出して要素を追加するときこれは、キュー内の要素の順序が、キューに入力された順序ではなく、有効期限によって並べ替えられることを意味します。キューの先頭にある要素が最も早く期限切れになり、遅くなるほど有効期限が切れます。

    • コンシューマ スレッドはキューの先頭にある要素をチェックします。取り出しではなく検査であることに注意してください。次に、要素の getDelay メソッドを呼び出します。このメソッドによって返された値が 0 未満または 0 に等しい場合、コンシューマ スレッドはキューから要素を取り出して処理します。 getDelay メソッドによって返された値が 0 より大きい場合、コンシューマ スレッドは wait によって返された時間値の経過後にキューの先頭から要素を取り出します。この時点で要素は期限切れになっているはずです。

    • はできません null 要素がこのキューに配置されます;

    • DelayQueue でできること

      • Taobao注文ビジネス: 注文後 30 分以内に支払いがない場合、注文は自動的にキャンセルされます;

      • お腹が空いていますか? 注文通知: テキスト メッセージ通知が送信されます注文が正常に行われてから 60 秒後にユーザーに送信されます;

      • アイドル状態の接続を閉じます。サーバーには多数のクライアント接続があり、一定期間アイドル状態になった後に閉じる必要があります (

      • キャッシュ)。キャッシュ内のオブジェクトは、アイドル時間が経過した後、キャッシュから削除する必要があります;

      • タスク タイムアウト処理。ネットワーク プロトコルのスライディング ウィンドウがリアクティブ インタラクションを要求する場合、タイムアウトの応答しない要求などを処理します。

      package com.yuzhenc.collection;
      
      import java.util.concurrent.DelayQueue;
      import java.util.concurrent.Delayed;
      import java.util.concurrent.TimeUnit;
      
      /**
       * @author: yuzhenc
       * @date: 2022-03-20 21:43:32
       * @desc: com.yuzhenc.collection
       * @version: 1.0
       */
      public class Test30 {
          //创建一个队列:
          DelayQueue<User> dq = new DelayQueue<>();
          //登录游戏:
          public void login(User user){
              dq.add(user);
              System.out.println("用户:[" + user.getId() +"],[" + user.getName() + "]已经登录,预计下机时间为:" + user.getEndTime() );
          }
          //时间到,退出游戏,队列中移除:
          public void logout(){
              //打印队列中剩余的人:
              System.out.println(dq);
              try {
                  User user = dq.take();
                  System.out.println("用户:[" + user.getId() +"],[" + user.getName() + "]上机时间到,自动退出游戏");
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
          //获取在线人数:
          public int onlineSize(){
              return dq.size();
          }
          //这是main方法,程序的入口
          public static void main(String[] args) {
              //创建测试类对象:
              Test30 test = new Test30();
              //添加登录的用户:
              test.login(new User(1,"张三",System.currentTimeMillis()+5000));
              test.login(new User(2,"李四",System.currentTimeMillis()+2000));
              test.login(new User(3,"王五",System.currentTimeMillis()+10000));
              //一直监控
              while(true){
                  //到期的话,就自动下线:
                  test.logout();
                  //队列中元素都被移除了的话,那么停止监控,停止程序即可
                  if(test.onlineSize() == 0){
                      break;
                  }
              }
          }
      }
      class User implements Delayed {
          private int id;//用户id
          private String name;//用户名字
          private long endTime;//结束时间
          public int getId() {
              return id;
          }
          public void setId(int id) {
              this.id = id;
          }
          public String getName() {
              return name;
          }
          public void setName(String name) {
              this.name = name;
          }
          public long getEndTime() {
              return endTime;
          }
          public void setEndTime(long endTime) {
              this.endTime = endTime;
          }
          public User(int id, String name, long endTime) {
              this.id = id;
              this.name = name;
              this.endTime = endTime;
          }
          //只包装用户名字就可以
          @Override
          public String toString() {
              return "User{" +
                      "name=&#39;" + name + &#39;\&#39;&#39; +
                      &#39;}&#39;;
          }
          @Override
          public long getDelay(TimeUnit unit) {
              //计算剩余时间 剩余时间小于0 <=0  证明已经到期
              return this.getEndTime() - System.currentTimeMillis();
          }
          @Override
          public int compareTo(Delayed o) {
              //队列中数据 到期时间的比较
              User other = (User)o;
              return ((Long)(this.getEndTime())).compareTo((Long)(other.getEndTime()));
          }
      }
      ログイン後にコピー

      Java スタックとキュー インスタンスの分析

      両端キュー

      リーリー

      以上がJava スタックとキュー インスタンスの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

    Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

    Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

    Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

    Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

    Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

    ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

    Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

    Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

    Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

    Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

    Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

    Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

    この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

    Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

    Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

    See all articles