国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java用while循環設計輪詢線程的性能問題

2019-11-06 06:34:48
字體:
來源:轉載
供稿:網友

java用while循環設計輪詢線程的性能問題

       輪詢線程在開發過程中的應用是比較廣泛的,在這我模擬一個場景,有一個隊列和輪詢線程,主線程往隊列中入隊消息,輪詢線程循環從隊列中讀取消息并打印消息內容。有點類似Android中Handler發送消息。

首先定義一個Message類。

public class Message { PRivate String content; public Message(String content) { this.content=content; } public void display(){ System.out.println(content); }}

       這個類很簡單,在構造的時候傳入消息內容,display()方法輸出打印消息內容。

       接下來定義一個輪詢線程,一開始蠢萌的我這么寫

public class PollingThread extends Thread implements Runnable { public static Queue<Message> queue = new LinkedTransferQueue<Message>(); @Override public void run() { while (true) { while (!queue.isEmpty()) { queue.poll().display(); } } }}

       這個輪詢線程功能很簡單,一直不停的輪詢隊列,一旦隊列中有消息進入,就將它出隊并調用display()方法輸出內容。

       接下來在Main()方法中循環創建消息將它放入隊列

public class Main { public static void main(String[] args){ PollingThread pollingThread=new PollingThread(); pollingThread.start(); int i=1; while(true) { PollingThread.queue.offer(new Message("新消息"+i)); i++; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } }}

運行結果

新消息1新消息2新消息3新消息4新消息5新消息6新消息7新消息8新消息9新消息10新消息11新消息12新消息13新消息14新消息15......

       雖然這么做,功能是實現了,可是我們來看下cpu占用率

這里寫圖片描述

       程序剛編譯啟動的時候cpu占用率到了100%,開始運行后一直處于44%左右。這個占用率還是比較高的,那么我們來分析一下這個輪詢線程,假設一直沒有消息入隊,或者消息入隊的間隔時間比較長的話,它就會循環的去執行while(!queue.isEmpty())判斷隊列是否為空,其實這個判斷操作是非常耗性能的。我們應該把這個輪詢線程設計的更合理一點。那么怎樣設計比較合理呢?既然循環對隊列判空是比較浪費性能的操作,那么我們如果可以讓這個輪詢線一開始處于阻塞狀態,主線程在每次入隊消息的時候通知輪詢線程循環出隊輸出消息內容,當隊列為空的時候輪詢線程又自動的進入阻塞狀態,就可以避免輪詢線程死循環對隊列判空。接下來我們改造一下輪詢線程和主線程的代碼

public class PollingThread extends Thread implements Runnable { public static Queue<Message> queue = new LinkedTransferQueue<Message>(); @Override public void run() { while (true) { while (!queue.isEmpty()) { queue.poll().display(); } //把隊列中的消息全部打印完之后讓線程阻塞 synchronized (Lock.class) { try { Lock.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }}public class Main { public static void main(String[] args){ PollingThread pollingThread=new PollingThread(); pollingThread.start(); int i=1; while(true) { PollingThread.queue.offer(new Message("新消息"+i)); i++; //有消息入隊后激活輪詢線程 synchronized (Lock.class) { Lock.class.notify(); } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } }}

       這時候再來運行一下

運行結果

新消息1新消息2新消息3新消息4新消息5新消息6新消息7新消息8新消息9新消息10新消息11......

再來看看cpu占用率

這里寫圖片描述

       輪詢線程經過改造后cpu占用率基本穩定在11%,比之前44%下降了不少。

       所以,在編寫輪詢線程的時候,盡量用通知的方式去讓輪詢線程執行操作,避免重復的條件判斷造成的性能浪費。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 北碚区| 厦门市| 原平市| 崇义县| 浙江省| 峨眉山市| 赫章县| 安丘市| 大方县| 澄江县| 眉山市| 孙吴县| 北流市| 西充县| 吴川市| 五寨县| 吉隆县| 南丹县| 霍林郭勒市| 登封市| 沁源县| 太白县| 华池县| 阿拉善盟| 遂溪县| 阆中市| 民勤县| 海盐县| 谷城县| 威海市| 岢岚县| 克拉玛依市| 新乡市| 潼南县| 河北区| 德格县| 乐山市| 元阳县| 葫芦岛市| 奎屯市| 苏尼特右旗|