尚學堂【官網】-西安Java培訓|c++培訓|Android培訓|安卓培訓|java視頻教程|軟件工程師|-西安雁塔尚學堂計算機學校
Java教程  尚學堂首頁Java學院Java教程

西安Java培訓隊列線程安全操作

www.zyopwk.live 發布人:java  |  來自:本站  |  發布時間:2017-10-31 15:29:10  |  點擊次數:1801

Java ConcurrentLinkedQueue隊列線程安全操作

代碼示例:

[java] view plain copy
  1. package async;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.Queue;  
  6. import java.util.concurrent.ConcurrentLinkedQueue;  
  7.   
  8. /** 
  9.  *  
  10.  * 線程安全隊列Queue實現計算科學古老的線程同步問題:生產者-消費者模型 
  11.  *  
  12.  * @author phil 
  13.  * 
  14.  */  
  15. public class Demo {  
  16.     public static void main(String[] args) {  
  17.         // 線程操作安全隊列,裝載數據  
  18.         Queue<String> queue = new ConcurrentLinkedQueue<String>();  
  19.   
  20.         // 消費者線程:不斷的消費隊列中的數據  
  21.         // 該線程不停的從隊列中取出隊列中最頭部的數據  
  22.         new Thread(new Runnable() {  
  23.             @Override  
  24.             public void run() {  
  25.                 while (true) {  
  26.                     // 從隊列的頭部取出并刪除該條數據  
  27.                     String s = queue.poll();  
  28.   
  29.                     if (s != null) {  
  30.                         System.out.println(System.currentTimeMillis() + "取出數據:" + s);  
  31.                     }  
  32.                 }  
  33.             }  
  34.   
  35.         }).start();  
  36.   
  37.         // 生產者線程A:不斷的生產單個數據并裝入隊列中  
  38.         // 該線程模擬不停的在隊列中裝入一個數據  
  39.         new Thread(new Runnable() {  
  40.             private int count = 0;  
  41.             private int number = 0;  
  42.   
  43.             @Override  
  44.             public void run() {  
  45.                 while (true) {  
  46.                     number = count++;  
  47.                     System.out.println("裝載數據:" + number);  
  48.                     queue.add(String.valueOf(number));  
  49.   
  50.                     try {  
  51.                         Thread.sleep(1000);  
  52.                     } catch (InterruptedException e) {  
  53.                         e.printStackTrace();  
  54.                     }  
  55.                 }  
  56.             }  
  57.   
  58.         }).start();  
  59.   
  60.         // 生產者線程B:不斷的生產批量數據并裝入隊列中  
  61.         // 該線程模擬不停的在隊列中裝入一批數據  
  62.         new Thread(new Runnable() {  
  63.             private List<String> lists = new ArrayList<String>();  
  64.             private int count = 0;  
  65.   
  66.             @Override  
  67.             public void run() {  
  68.                 while (true) {  
  69.                     // 一批數據的數量,不定長  
  70.                     count = (int) (Math.random() * 5);  
  71.                     for (int i = 0; i < count; i++) {  
  72.                         lists.add("批量數據-" + i + "," + Math.random());  
  73.                     }  
  74.   
  75.                     queue.addAll(lists);  
  76.                     lists.clear();  
  77.   
  78.                     try {  
  79.                         Thread.sleep(1000);  
  80.                     } catch (InterruptedException e) {  
  81.                         e.printStackTrace();  
  82.                     }  
  83.                 }  
  84.             }  
  85.   
  86.         }).start();  
  87.     }  
  88. }  


代碼運行結果:

[plain] view plain copy
  1. 裝載數據:0  
  2. 1490417519703取出數據:0  
  3. 1490417519705取出數據:批量數據-0,0.9045746291285363  
  4. 裝載數據:1  
  5. 1490417520703取出數據:1  
  6. 1490417520705取出數據:批量數據-0,0.9378737341890285  
  7. 1490417520705取出數據:批量數據-1,0.5609780480099475  
  8. 1490417520705取出數據:批量數據-2,0.27383078038481046  
  9. 1490417520705取出數據:批量數據-3,0.6824300990854635  
  10. 裝載數據:2  
  11. 1490417521704取出數據:2  
  12. 1490417521706取出數據:批量數據-0,0.23916865770830298  
  13. 裝載數據:3  
  14. 1490417522704取出數據:3  
  15. 1490417522706取出數據:批量數據-0,0.4169859285695523  
  16. 1490417522706取出數據:批量數據-1,0.6667611178989155  
  17. 1490417522706取出數據:批量數據-2,0.9026516620769446  
  18. 1490417522706取出數據:批量數據-3,0.3491566771349188  
  19. 裝載數據:4  
  20. 1490417523705取出數據:4  
  21. 1490417523707取出數據:批量數據-0,0.5634243124726268  
  22. 1490417523707取出數據:批量數據-1,0.4021826644433847  
  23. 裝載數據:5  
  24. 1490417524705取出數據:5  
  25. 1490417524707取出數據:批量數據-0,0.9431588628811881  
  26. 1490417524707取出數據:批量數據-1,0.8762171226841987  
  27. 1490417524707取出數據:批量數據-2,0.0470837112538508  
  28. 裝載數據:6  
  29. 1490417525705取出數據:6  
  30. 1490417525707取出數據:批量數據-0,0.31099249499423265  
  31. 1490417525707取出數據:批量數據-1,0.7660770869693369  
  32. 1490417525707取出數據:批量數據-2,0.3209338524956993  
  33. 1490417525707取出數據:批量數據-3,0.2525376039263991  
  34. 裝載數據:7  
  35. 1490417526706取出數據:7  
  36. 1490417526708取出數據:批量數據-0,0.6369286896471094  

當前文:西安Java培訓隊列線程安全操作
上一頁:JavaJVM類加載機制 西安尚學堂
下一頁:尚學堂Java基礎類的加載
在線報名(*為必填項)
云南快乐十分开奖走势图