目次
1。SynchronizedMethodを使用してwait()およびnotify()を使用します
2。ブロックキューの使用(推奨)
ホームページ Java &#&チュートリアル Javaでプロデューサーと消費者の問題を実装する方法は?

Javaでプロデューサーと消費者の問題を実装する方法は?

Sep 16, 2025 am 05:06 AM
java プロデューサーと消費者

Wait()とNotify()を使用してプロデューサーの消費者問題を実装します。同期されたメソッドは、共有バッファーへのアクセスを制御するために使用されます。プロデューサーは、バッファーがいっぱいになると待機し、消費者はバッファーが空になったときに待機し、notify()を使用して対応するスレッドを起動します。 2。java.util.concurrentパッケージでブロックキューを使用して、スレッドセーフデータ交換をより簡単に実装し、ロックの手動管理と条件付き待機を避けます。

Javaでプロデューサーと消費者の問題を実装する方法は?

プロデューサーと消費者の問題は、1つ以上のスレッド(プロデューサー)がデータを生成して共有バッファーに入れ、他のスレッド(消費者)がデータを取得して処理する一方、マルチスレッドの古典的な同期の問題です。この課題は、共有バッファーにアクセスするときにスレッドの安全性を確保し、レースの状況、デッドロック、忙しい待機などの問題を回避することにあります。

Javaでは、 java.util.concurrentパッケージのクラスで、 wait()notify() 、および同期ブロックを使用して効率的に解決できます。以下は2つの実際の実装です。

1。SynchronizedMethodを使用してwait()およびnotify()を使用します

このアプローチは、固有のロックを使用して手動でスレッド調整を管理します。

//共有バッファクラス

クラスSharedBuffer {<br> プライベートファイナルint []バッファー。<br> Private int index = 0;<br><br> public sharedbuffer(int size){<br> this.buffer = new int [size];<br> }<br><br> public同期voidプロデュース(int値)が断続的なエクセプトをスローします{<br> while(index == buffer.length){<br> //バッファーフル - 消費者を待ちます<br> 待って();<br> }<br> バッファー[index] = value;<br> system.out.println( "生成:" value);<br> notify(); //待機中の消費者に通知します<br> }<br><br> Public Synchronized Int Consumption()Throws arturnedexception {<br> while(index == 0){<br> //空のバッファ - プロデューサーを待ちます<br> 待って();<br> }<br> int value = buffer [ -  index];<br> System.out.println( "消費:"値);<br> notify(); //待機中のプロデューサーに通知します<br> 返品値。<br> }<br> }

//プロデューサースレッド

クラスプロデューサーは実行可能{<br> プライベートファイナル共有バッファバッファー。<br><br> パブリックプロデューサー(sharedbufferバッファー){<br> this.buffer = buffer;<br> }<br><br> @オーバーライド<br> public void run(){<br> 試す {<br> for(int i = 1; i <= 10; i){<br> buffer.produce(i);<br> thread.sleep(100); //生成する時間をシミュレートします<br> }<br> } catch(arternedexception e){<br> thread.currentThread()。<br> }<br> }<br> }

//消費者スレッド

クラスの消費者は実行可能{<br> プライベートファイナル共有バッファバッファー。<br><br> パブリック消費者(SharedBufferバッファー){<br> this.buffer = buffer;<br> }<br><br> @オーバーライド<br> public void run(){<br> 試す {<br> for(int i = 1; i <= 10; i){<br> buffer.consume();<br> thread.sleep(200); //消費する時間をシミュレートします<br> }<br> } catch(arternedexception e){<br> thread.currentThread()。<br> }<br> }<br> }

//スレッドを開始するメインクラス

パブリッククラスの生産者corsumerexample {<br> public static void main(string [] args){<br> sharedbuffer buffer = new sharedbuffer(5);<br><br> スレッドプロデューサーThread = newスレッド(新しいプロデューサー(バッファー)、「プロデューサー」);<br> Thread ConsumerThread = newスレッド(new Consumer(Buffer)、 "Consumer");<br><br> producterthread.start();<br> ConsumerThread.start();<br> }<br> }

2。ブロックキューの使用(推奨)

よりシンプルでより安全な方法は、内部で同期を処理するjava.util.concurrentのblockingqueueを使用することです。

 java.util.concurrent.blockingqueueをインポートします。<br> java.util.concurrent.linkedblockingqueueをインポートします。<br><br>クラスSafeBuffer {<br> プライベートファイナルブロッキングキュー<Integer>キュー;<br><br> Public SafeBuffer(int capitial){<br> this.queue = new linkedblockingqueue <>(容量);<br> }<br><br> public void produce(int value)throws arturnedexception {<br> queue.put(value); //いっぱいの場合は自動的に待機します<br> system.out.println( "生成:" value);<br> }<br><br> public int consumption()throws arturnedexception {<br> int value = queue.take(); //空の場合は自動的に待機します<br> System.out.println( "消費:"値);<br> 返品値。<br> }<br> }

対応するプロデューサーと消費者のクラスは、代わりにSafeBufferを使用し、主な方法は同様のままです。このバージョンは、手動のロック管理を回避し、エラーリスクを減らします。

BlockingQueueの使用は、クリーナーでエラーが発生しやすく、タイムアウト( offer()Poll()を使用してタイムアウトなどの追加機能を提供するため、一般的に推奨されます。

基本的に、ニーズに基づいてアプローチを選択するだけです。待機/通知による低レベルのコントロール、またはブロッキングキューでのシンプルさと信頼性。

以上がJavaでプロデューサーと消費者の問題を実装する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Stock Market GPT

Stock Market GPT

AIを活用した投資調査により賢明な意思決定を実現

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

フォルダを見つける場所 フォルダを見つける場所 Sep 20, 2025 am 07:57 AM

最も直接的な方法は、通常はデスクトップ、ドキュメント、ダウンロードなどのフォルダーでストレージの場所を思い出すことです。見つからない場合は、システム検索機能を使用できます。ファイルの「欠落」は、主に保存パスの攻撃、名前メモリ偏差、ファイルの隠れ、またはクラウドの同期などの問題が原因です。効率的な管理の提案:プロジェクト、時間、タイプごとに分類し、迅速なアクセスを適切に使用し、定期的にクリーンでアーカイブし、命名を標準化します。ファイルエクスプローラーとタスクバーを検索および検索しますが、MacOSはFinderとSpotlightに依存しています。これはよりスマートで効率的です。ツールを習得し、良い習慣を開発することが重要です。

Javaでファイルを作成する方法 Javaでファイルを作成する方法 Sep 21, 2025 am 03:54 AM

usefile.createNewfile()tocreatefileonlyifitdoes notexist、avolididingoverwriting;

JavaのClassPathにJARファイルを追加する方法は? JavaのClassPathにJARファイルを追加する方法は? Sep 21, 2025 am 05:09 AM

-CPパラメーターを使用してJARをClassPathに追加して、JVMがjava-cplibrary.jarcom.example.mainなどの内部クラスとリソースをロードできるようにします。

Google Chromeはこのページをロードできません Google Chromeはこのページをロードできません Sep 20, 2025 am 03:51 AM

最初に、ネットワーク接続が正常かどうかを確認します。他のWebサイトを開くことができない場合、問題はネットワーク上にあります。 1.ブラウザのキャッシュとCookieをクリアし、Chromeの設定を入力して、閲覧データをクリアします。 2。拡張機能を閉じると、スカレッレスモードを使用して、プラグインの競合によって引き起こされるかどうかをテストできます。 3.ネットワーク接続が傍受されないように、プロキシまたはVPN設定を確認して閉じます。 4. Chromeネットワーク設定をリセットし、デフォルトの構成を復元します。 5.互換性の問題を解決するために、Chromeを最新バージョンに更新または再インストールします。 6.他のブラウザを使用して比較およびテストして、問題がChromeのみであるかどうかを確認します。 err_connection_timed_outやerr_ssl_protocol_erなどのエラープロンプトに応じて

Java GenericsとWildcardsの理解 Java GenericsとWildcardsの理解 Sep 20, 2025 am 01:58 AM

javagenericsprovideCompile-timeTypeSafeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTyParaMetersonClasses、interfaces、and methods; wildcards(?、extendStype、?supertype)HeandnwondTypeswithFexibility.1.1.UnunboundCardCardCardCardCardCardCardCardCardCardCardの装備

なぜリアルタイムシステムが決定論的応答を保証する必要があるのですか? なぜリアルタイムシステムが決定論的応答を保証する必要があるのですか? Sep 22, 2025 pm 04:03 PM

リアルタイムシステムには、正確性が結果配信時間に依存するため、決定論的応答が必要です。ハードリアルタイムシステムには厳格な締め切りが必要であり、逃したことは災害につながりますが、ソフトリアルタイムは時折遅延を可能にします。スケジューリング、割り込み、キャッシュ、メモリ管理などの非決定的要因はタイミングに影響します。建設計画には、RTOの選択、WCET分析、リソース管理、ハードウェアの最適化、厳密なテストが含まれます。

UC Browser_uc Browserの強制スケーリングWebページでWebページを強制する方法UCブラウザーによるスケーリングWebページ UC Browser_uc Browserの強制スケーリングWebページでWebページを強制する方法UCブラウザーによるスケーリングWebページ Sep 24, 2025 pm 04:54 PM

まず、UCブラウザの組み込みスケーリング関数を有効にし、設定→[設定]→[フォントと版画]またはページスケーリングを参照し、プリセット比またはカスタムパーセンテージを選択します。第二に、2本の指でジェスチャーを開いたりピンチしたりすることにより、ページディスプレイサイズを強制することができます。スケーリングを制限するWebページの場合、Webサイトのデスクトップバージョンに制限のロックを解除することを要求できます。上級ユーザーは、アドレスバーでJavaScriptコードを実行して、より柔軟な強制スケーリング効果を実現することにより、ViewPort属性を変更することもできます。

Javaの例外をどのように処理しますか? Javaの例外をどのように処理しますか? Sep 23, 2025 am 04:44 AM

Java例外処理トライキャッチブロックを介して例外をキャッチし、最後にブロックはリソースのクリーンアップを保証し、リソースでリソースを自動的に管理し、宣言の例外をスローし、特定の例外を扱うカスタム例外をスローし、例外を無視するのではなく、空の漁獲ブロックを避けるなどのベストプラクティスに従います。

See all articles