尚学堂【官网】-西安Java培训|c++培训|Android培训|安卓培训|java视频教程|软件工程师|-西安雁塔尚学堂计算机学校
Java教程  尚学堂首页Java学院Java教程

西安Java培训队列线程安全操作

www.xasxt.com 发布人:java  |  来自:本站  |  发布时间:2017-10-31 15:29:10  |  点击次数:1163

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基础类的加载
在线报名(*为必填项)