日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA——附加作业3——订阅报刊杂志

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA——附加作业3——订阅报刊杂志 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實驗內容
以讀者訂閱報刊雜志為背景,體驗多線程生產/訂閱模式下的經典應用。
具體業務描述
本實驗以實際生活中報刊雜志的訂閱為業務背景。訂閱者通常有很多種,他們可以
同時向出版社發出訂閱申請; 出版社通常根據自身的資源條件對收到的訂閱申請做統
一的處理;出版社通常能接受并處理的訂閱申請量是有一定限度的;出版社匯總訂閱申
請信息后交由獨立業務單元處理,直至完畢;本業務主要是模擬多讀者同時訂閱、信息
匯總后再行處理的業務情景。
本實驗的關鍵業務概念:
1) 訂閱者,即訂閱信息生產者,向共享池中放入訂閱信息;
2) 信息匯總,即訂閱信息共享池,生產者和消費者共用;
3) 業務單元,即訂閱信息消費者,處理訂閱者生產的訂閱信息。
創建工程并配置環境
1) 工程名:SE_JAVA_EXP_E03。
2) 創建包,取名:cn.com.java.experiment 和 cn.com.java.experiment.entity。
3) 在 包 cn.com.java.experiment.entity 下 創建訂閱信息共享池業務類:SharePool。

  • 設置兩個屬性,只為 pool 屬性實現 setter/getter 方法;

  • 為 SharePool 類創建構造器,初始化最大限量的訂閱信息;

  • 創建生成訂閱信息的方法 produce,由訂閱者調用,生成訂閱信息并完成訂閱信息的提交,實現要求如下:
    1.應用同步機制控制本方法的實現;
    2.獲取當前訂閱信息共享池的信息數量;
    3.當共享池信息數量等于最大訂閱量時,輸出如下信息并開始等待:“訂閱請求隊列已滿,等待系統處理訂閱請求中……”
    4.當共享池信息數量小于最大訂閱量時:把訂閱信息加入到共享池;在控制臺輸出如下格式的信息:“訂閱者@”+當前線程名+":訂閱《" + media + “》申請已提交.當前訂閱數量為:” + 訂閱數量;發出完成訂閱申請的通知。

  • 創建處理訂閱信息的方法 consum,由訂閱信息消費者調用,完成訂閱信
    息的處理。實現要求如下:
    1…應用同步機制控制本方法的實現;
    2.獲取當前訂閱信息共享池的信息數量;
    3.當共享池信息數量等于 0 時,輸出如下信息并開始等待:“處理者@” +當前線程名稱+“暫無訂閱請求信息,等待中……”
    4.當共享池信息數量不為 0 時:從訂閱共享池移除一項訂閱信息;在控制臺輸出如下格式的信息:“處理者@”+當前線程名+":處理《" + 移除訂閱信息 + “》訂閱已完畢。尚待處理訂閱數量為:” + 剩余訂閱數量;發出完成訂閱處理的通知。

4) 在 cn.com.java.experiment.entity 包中創建訂閱信息生產者業務類:Producer

  • Producer 類需要實現線程類接口 Runnable,并且實現 run 方法;

  • 為 Producer 類創建訂閱信息共享池屬性,要求如下:

  • 為 Producer 類創建構造器;

  • 為 Producer 類實現生產訂閱信息的 run 方法,以產生指定數量訂閱信息并
    存放到訂閱共享池中。實現要求如下:
    1.模擬輸出訂閱者相關信息,格式如下: “訂閱者@”+當前線程名稱+“:訂閱”+訂閱數量+“份。”;
    2.通過循環方式發出所有指定數量的訂閱請求:當訂閱數量發送完畢后,結束訂閱并輸出如下信息: “訂閱者@”+當前線程名稱+“->完成訂閱。”定義計數器,把信息放入到訂閱信息共享池并輸出如下信息:“訂閱者@”+當前線程名稱+“ 在提交第”+計數器+“ 份訂閱申請。”讓當前線程休眠半秒鐘;訂閱完畢后退出方法。

5) 在 cn.com.java.experiment.entity 包中創建訂閱信息處理者業務類:Consumer

  • Consumer 類需要實現線程類接口 Runnable,并且實現 run 方法;

  • 為 Consumer 類創建訂閱信息共享池屬性,要求如下:

  • 為 Consumer 類創建構造器;

  • 為 Consumer 類實現生產訂閱信息的 run 方法,產生指定數量的訂閱信息并存放到訂閱信息共享池中。實現要求如下:
    1.創建處理訂閱信息數量的計數器;
    2.通過循環方式處理共享池內的所有訂閱信息:啟動計數器,當計數器大于15 時,結束處理并輸出如下信息:“本線程完成訂閱處理量,即刻退出。處理者@”+當前線程名稱;當計數器小于 15 時,處理共享池內的訂閱信息并輸出如下信息:“訂閱者@”+當前線程名稱+“ :處理第”+計數器+“ 份訂閱。”處理全部完成后,退出信息訂閱池。

6) 在包 cn.com.java.experiment 下創建主類:MainClass,模擬現實生產/處理的結
果。

  • 為 MainClass 創建入口主方法:main;
  • 在 main 中,創建 1 個訂閱信息共享池對象;
  • 在 main 中,創建 5 個不同的訂閱者,訂閱總量為 15,共用共享池;
  • main 中,創建 1 個訂閱處理類對象,處理所有提交的訂閱信息。
  • 代碼
    Mainclass

    package cn.com.java.experiment;import cn.com.java.experiment.entity.Consumer; import cn.com.java.experiment.entity.Producer; import cn.com.java.experiment.entity.SharePool;public class MainClass {public static void main(String[] args) {SharePool pool = new SharePool();for (int i = 1; i <= 5; i++) {new Thread(new Producer(pool, i)).start();}new Thread(new Consumer(pool)).start();} }

    Consumer

    package cn.com.java.experiment.entity;public class Consumer implements Runnable {private SharePool pool;public Consumer() {super();}public Consumer(SharePool pool) {super();this.pool = pool;}public void run() {int counts = 1;while(true){if(counts <= 15) {System.out.println("處理者@" + Thread.currentThread().getName() + ":處理第" + counts + "份訂閱。");this.pool.consume();}else{System.out.println("本線程完成訂閱處理量,即刻退出。處理者@" + Thread.currentThread().getName());break;}counts++;}} }

    Producer

    package cn.com.java.experiment.entity;public class Producer implements Runnable {private SharePool pool; private int count; public Producer() {super();}public Producer(SharePool pool, int count) {super();this.pool = pool;this.count = count;}public void run() {String infor = "報刊雜志";int counts = 0;System.out.println("訂閱者@" + Thread.currentThread().getName() + ":訂閱" + count + "份。");while (count > 0) {counts++;System.out.println("訂閱者@" + Thread.currentThread().getName() + " 在提交第" + counts + " 份訂閱申請。");pool.produce(infor + counts);count--;try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("訂閱者@" + Thread.currentThread().getName() + "->完成訂閱。");} }

    Sharepool

    package cn.com.java.experiment.entity;import java.util.ArrayList; import java.util.List;public class SharePool {private List<String> pool=new ArrayList(); private final int MAX=15; public List<String> getPool(){return pool;}public void setPool(List<String> pool) {this.pool = pool;}public SharePool() {super();}public void produce(String infor) {synchronized (this) {if (pool.size() == MAX) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("訂閱請求隊列已滿,等待系統處理訂閱請求中......");}else {pool.add(infor);System.out.println("訂閱者@" + Thread.currentThread().getName() + ":訂閱《" + infor + "》申請已提交.當前訂閱數量為:" + pool.size());try{notify();}catch(Exception e ) {e.printStackTrace();}}}}public void consume() {synchronized (this) {if (pool.size() == 0) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("處理者@" + Thread.currentThread().getName() + "暫無訂閱請求信息,等待中......");}else {String infor = pool.remove(0);System.out.println("處理者@" + Thread.currentThread().getName() + ":處理《" + infor + "》訂閱已完畢。尚待處理訂閱數量為:" + pool.size());try{notify();}catch(Exception e) {e.printStackTrace();}}}} }

    截圖

    總結

    以上是生活随笔為你收集整理的JAVA——附加作业3——订阅报刊杂志的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。