キューの使い方とは?プログラムでの必要性はあるのか?

このQ&Aのポイント
  • キューとは、先入れ先出し(FIFO)のデータ構造を持つデータコレクションです。プログラムでの使用例としては、複数の処理要求を順番に処理する場合や、タスクのスケジューリングなどが挙げられます。
  • 例えば、複数のユーザーからのリクエストを受け付けて、順番に処理する場合にキューが活用されます。この場合、先にリクエストが来たユーザーの処理が優先されます。キューは順序を保持するため、処理の順番が保証されます。
  • また、業務アプリケーションでは、同時に処理される要求が複数あり、それぞれの処理が依存関係を持っている場合もあります。キューを使用することで、依存関係を保ちつつ、正確な順序で処理を行うことができます。キューは重要なデータ構造であり、プログラミングにおいては頻繁に使用されることがあります。
回答を見る
  • ベストアンサー

キューについて

インターネットの記事でjava.util.Queueの使い方に関する記事を読んでいてふと思ったのですが このQueueというものを使用する場面が想像できなかったので質問させてください。 キューを使用することで先入れ先出しで処理されると思うのですがそもそもプログラムってそういう ものなんじゃないの?(早い者勝ちで処理される)と思ってしまいました。 例えばAさんとBさんが同じ処理を行うボタンを押したとして、Aさんのリクエストが早ければAさんの 処理、Bさんのリクエストが早ければBさんの処理が先に行われる。 そう考えるとキューというクラス(インターフェース)自体必要なの? って思って使い道が想像がつかなかったのですがどうなのでしょうか。 ※例のような動きを実現させるために必要なのであろうとは思うのですが業務アプリを作る上では 必要性について想像がつかなかったのですが使用する場面はあるのでしょうか。

  • Java
  • 回答数4
  • ありがとう数10

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

すこし勘違いされていると思います。 >例えばAさんとBさんが同じ処理を行うボタンを押したとして、Aさんのリクエストが早ければAさんの >処理、Bさんのリクエストが早ければBさんの処理が先に行われる。 この『順番に処理される』というのは、内部でキューを使用しているからです。 キューやスタックは、処理を順番に行うという目的もありますが、「他の処理が終わるのを待つ」という目的もあります。 AさんとBさんが同時にボタンを押した場合、キューを使わなければ、「早い者勝ちで処理される」という部分は同じですが、 遅い人は処理を中止します。(順番に、とか、他の人が終わってから処理する、というようなことはありません。何も出来なくなります。)

unko347
質問者

補足

>>遅い人は処理を中止します。(順番に、とか、他の人が終わってから処理する、というようなことはありません。何も出来なくなります。) このあたりの認識がありませんでした。キューは必須の概念なのですね。 ご回答ありがとうございました。

その他の回答 (3)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

ならば >例えばAさんとBさんが同じ処理を行うボタンを押したとして、 >Aさんのリクエストが早ければAさんの処理、Bさんのリクエストが早ければBさんの処理が先に行われる。 というのを十万人に対して、しかも処理順を間違えることなく、さらに二重押しを防ぐため処理実行はともかくリクエストを受け取ったことを早期にボタンを押した人に返信する必要がある場合を考えてみてください。 そんな場合にキューを使って、とりあえずデータを受け取って返信するスレッドとキューの先頭のデータに対して処理をするスレッドを並走させればすっきりとしたシステムになりませんか? そして、オンライン予約システムってちょうど上記のような要求がされるシステムですよね?

unko347
質問者

補足

ご回答ありがとうございます。

  • wormhole
  • ベストアンサー率28% (1619/5654)
回答No.2

例えば、 ・メッセージを受信してキューに入れるスレッド ・キューにメッセージが入っていたら取り出して処理するスレッドを起動するスレッド という風にしてキューを利用すればメッセージを受信するスレッドは、メッセージに対する処理が終わるのをまたずにメッセージ受信処理ができます(キューがなかったらどうなるか考えてみてください)

unko347
質問者

補足

ご回答ありがとうございます。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

キューはFIFO (先入れ先出しの待ち行列)と LIFO (後入れ先出しのスタック)があります。 例えばデータファイルを読んで(総行数を数えられる) 01/10 1行目 02/10 2行目 03/10 3行目 04/10 4行目 05/10 5行目 06/10 6行目 07/10 7行目 08/10 8行目 09/10 9行目 10/10 10行目 といった使い方ができます。 LIFOは 10/10 10行目 09/10 9行目 08/10 8行目 07/10 7行目 06/10 6行目 05/10 5行目 04/10 4行目 03/10 3行目 02/10 2行目 01/10 1行目 こんなこともできます。 データファイルと書きましたが、エディターを作るようなとき、 部分を指定して上下反転することができます。 apple char(01) 'りんご' orange char(04) 'みかん' grape char(05) 'グレープ' があったら apple char(01) orange char(04) grape char(05) apple 'りんご' orange 'みかん' grape 'グレープ' というような変換もできます。(データベースのテーブル作成で有効だったりする)

unko347
質問者

補足

ご回答ありがとうございます。

関連するQ&A

  • メッセージキューのFIFOの保証

    Solaris10を使用しています。 プロセスAがメッセージキューXに対してメッセージを投げます。 プロセスBがキューXからメッセージを受け取り、処理をします。 プロセスBは複数プロセス(B-1,B-2・・・)あり、すべてがキューXでメッセージを受け取り処理をします。(A:B=1:多になる) この場合 (1)メッセージキューXのFIFO(先入先出)は普通保証されるでしょうか。 (2)プロセスBはメッセージ取得順にメッセージの割り当てが行われるでしょうか。(つまりB-1が先でB-2が後から取りに行ったらB-1に先にメッセージを渡すのが保証されるかどうか。) (3)上記を行うためには、キューの作成もしくはOSのパラメータの設定が必要か、必要ならどれを設定すればいいか。 よろしくお願いします。

  • キューとスタックの問題です、宜しくお願いします

     (多分基本情報処理に関する問題だと思うのですが)データ構造に関する問題です、いくら考えても分かりません、宜しくお願いします。 【問】空の状態のキューとスタックの二つのデータ構造がある。 次の手続きを順に実行した場合、変数xに代入されるデータはどれか。 ここで、 ・データyをスタックに挿入することをpush(y) ・スタックからデータを取り出すことをpop( ) ・データyをキューに挿入することをenq(y) ・キューからデータを取り出すことをdeq( ) と表す。 (1)push(a) (2)push (b) (3)enq(pop( )) (4)enq(c) (5)push(d) (6)push(dep( )) (7)pop( ) → x 以上の答えとして(6)にはbがスタックにpushされるので、後入れ先出し を考えると当然「xにはb」が入るはずなのですが、どうも答えは「d」となっています。 「d」は「b」より前にスタックされてますので、最新で取出される情報は「b」しかないと思うのですが、誰か誤りを指摘してください、宜しくお願いします。

  • メッセージキューイングとは?

    すみません。 メッセージキューイングとは、どのように使用するものでしょうか? まだ、開発経験が浅い為、このような質問方法でいいかもよく分かっていないのですが、どなたか分かりやすく回答頂けないでしょうか? 例えば、同サーバー(Win2003サーバー)内で、AとBのプロセスがあった場合にAからメッセージを発行し、Bはそのメッセージを受け取って処理を開始するみたいに使用出来るのでしょうか?

  • 購入価格が違う株式の1つを売却した時の譲渡益の計算

    購入時期が古い順に単価A500円、B600円、C700円の株式、計3,000株のうち、1,000株だけ1,000円で売却した時、譲渡益の計算はA、B、Cどれでも任意の購入単価を使って計算して良いのですか?それとも「先入れ先出し」で単価Aを売却したとみなして計算しないといけないのでしょうか? 任意なら単価Cを使った方が譲渡益が少なくなりますから税金も少なくて済みます。

  • CUEファイルを作成

    アルバムが単一になったmp3ファイルを入手したのですが  元の複数のファイルに分割したいのでCUEファイルが必要になりました。 CUEファイルをなるべく簡単に作成できるアプリはありませんか ? フォーマットは、下記形式を予定 FILE ”ファイル名" MP3 TRACK 01 AUDIO TITLE "A" INDEX 01 00:00:00 TRACK 02 AUDIO TITLE "B" INDEX 01 00:05:30 TRACK 03 AUDIO TITLE "C" INDEX 01 00:15:30 各mp3のインデックス/リスト(曲名、再生時間)は、EXCELで作成済みです。   例 B2: 01 Sorahe        C2: 05:25 B3: 02 umikara C3: 04:56 --------------- できれば、EXCELベースのアプリが良いのですが   EXCELベースでなくても構いません。

  • 複数の項目からの在庫管理

    エクセル97で  ----------------------------------------------   A     B       C    D   E 1 (lot) (納入先・出荷先)(入荷本数)(出荷本数)(残数) 2 12345 東京        2           2 3 12345 東京        2          4  4 12555 東京        2          6 5 12345      大阪        4     2 ---------------------------------------------- 上記内容の表があります。 LOT番号の古いLOT本数か終わりになると(済)と解るようにしたいのですが、・・・ 又、他に何か先入れ先出しで良い方法は無いでしょうか。 この上記の表にかまわず古いLOTを出荷してか新しいLOTを出したいのです。 出来れば関数でしたいのですが、解られる方いないでしょうか?  条件としては、入出荷ユーザー・入出荷日・品名・LOT番号が項目として必要です。 宜しくお願いします。

  • 【まだ生きていたか】【まだ生きているか】

    A 貴様、まだ生きていたか?  B 貴様、まだ生きているか? どんな時にAを言いますか?つまり【た】形です。 どんな時にBを言いますか?つまり【る】形です。   それぞれの場面を想像して例を挙げていただけますか?

  • プリンタキュー削除

    質問を見て頂きありがとうございます<m(__)m> 現在、私は某会社の運用管理業務をしています。 まだまだペーペーですが…。 先輩に聞いても「分からない」と全員に言われ、調べては見たもののわからないのでここで質問します…。 現場の顧客より、毎日定時にある処理を実施し、そこで出た結果を印刷し提出しています。 ちなみにPCのOSは「WindowsXP Pro」です。 印刷物は大量にあり、再処理は出来ないものもあります。 その為、印刷定義の設定の中にある「印刷後ドキュメントを残す」という設定にし、スプールファイルを残しています。 毎日残しているとHDDを圧迫してしまうので、毎日全ての定義でジョブを削除しています。 それを自動化しようと考えたのです。 ある程度できました。XP以降に入っているvbsを使用し、batを作りました。 cscript prnqctl.vbs -x -s サーバ名(または処理端末名) -p プリンタ名 これを各処理端末、及びサーバの各プリンタ定義に対して実行して残っている全てのジョブを削除します。 しかし…問題がありました。 サーバで処理している分が削除できません…。 サーバのOSが「Windows2000 PRO SP2」だったのです…。 それが原因かはわかりませんが…恐らくそれだと思いました。 スクリプトを実行すると、 『失敗 削除 エラー 0x1B6 オブジェクトでサポートされていないプロパティまたはメソッドです』 と表示され、実行できません。 もちろん2000上でスクリプトを実行し、ヘルプを閲覧することくらいは可能ですが、キューの削除が行えません…。 あとこれだけ出きれば、完全に自動で削除できます。他に何か方法ありましたら、教えていただけるととても嬉しいです。 もちろん、私自身も時間ある限り調べます。 よろしくお願いいたします<m(__)m>

  • linuxのルーティング処理

    CentOS6.3で、iptablesでルータを作成しようとしております。 CentOS6.3に、NICを2枚刺し、二つのセグメント(A:192.168.11.0/24 と B:192.168.11.24)があります。 AからBにルーティング処理させたいのですが、 「iptablesのFORWARDを使用して処理させるのでしょうか?」 先ほど調べてたところ 「route add コマンド 」 を使用してルーティング処理を記述するという記事も見つかったのですが CentOSルーターを作成する場合、どちらで処理させるのでしょうか? Ciscoルーターでルーティング処理を作成したことはありますので、 基本的なことは分かっています。 ご教授お願いします。

  • 中古ビリヤードキューの売値の相場が知りたい

    サウスウエスト製ビリヤードキューの売却を考えています。 もう数年使用していないのですが、まだ愛着もあるし、非常に高価なものだったので、あまり安売りはしたくありません。 そこで今売るとしたらどれくらいの相場なのかが知りたいです。 仕様と状態は以下の通りです。 ・黒檀ベースでシンプルな6剣ハギ(朱色、多分メープル)が入ったデザイン。 ・20oz弱(正確に測ったことはありません。) ・バットに2mm程度の目立つ傷有り。ただし、コーティング表面で止まっているので修復可能と思われます。 ・シャフト2本付き。堅めの1本は未使用です。 ・比較的やわらかめの方の使用済みのシャフトは、コツに目立つ傷が有ります。チョークで青ばんでいます。 ・1988年に40万円弱で購入し、3年程度使用。以降、ジョーホッパーのケースに入れて押入れで15年保管。数年に1度程度思い出して取り出して眺めていますが、まったく撞いていません。 ・購入から20年経った現在でも、シャフト、バットの曲がりはまったくありません。(芯を見たり、ころがしたりして見て分かる範囲で) ・3年程度の使用なので、ジョイントの劣化も感じられません。 ・古い記憶ですが、肝心の撞いた感じは以下の通りです。   少しひねった程度ではまったく見越しは必要ありませんでした。教科書に出てくるような、撞点に向かってそのまま撞き出せばその方向に手玉が走る感じ。でも、ひねりを大きくしていくと、急にずれはじめる感じでした。(これは多分に、私の技術力の無さだと思っています。)当時A級の人に撞いてもらった感想は、今まで撞いたキューの中で一番引ける、でした。 隠し立てや誇張無くそのまま書いたつもりです。 よろしくお願いします。

専門家に質問してみよう