模拟场景:main方法为网络请求线程(也叫生产者线程),在网络请求线程中开启四个线程(消费者线程),进行高效处理队列中的共同资源(生产者线程生产的共同资源),等待资源处理完毕,网络请求线程执行结束,响应客户端。
消费者线程的线程体
1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 import java.util.concurrent.BlockingQueue; 4 import java.util.concurrent.LinkedBlockingQueue; 5 import java.util.concurrent.TimeUnit; 6 7 /** 8 * 【1】实现Runnable接口,重写run方法。 9 * 【2】run方法内的逻辑代码就是线程体 10 * 【3】创建线程类的对象 11 * 【4】创建线程类的代理对象 12 * 【5】代理对象调用start(),启动线程 13 * @author it-c-1201 14 * 15 */ 16 public class MyThread implements Runnable{ 17 //多线程访问共同资源的队列 18 private BlockingQueue<String> a = new LinkedBlockingQueue<String>(); 19 20 //队列中共同资源的个数 21 private Integer count=0; 22 23 //线程锁 24 private Object object=new Object(); 25 26 //生产者生产完成标示<false 未生产完成,true 生产完成> 27 private boolean flag=false; 28 29 //线程类构造器。 30 public MyThread(BlockingQueue<String> a){ 31 this.a=a; 32 } 33 34 //获取线程锁对象 35 public Object getObjectByLock(){ 36 return this.object; 37 } 38 39 //标志生产者生产结束 40 public void setFlag(){ 41 this.flag=true; 42 } 43 44 //队列数据加一个 45 public void setCount(){ 46 //当出现队列数据小于1的情况,恢复队列中数据个数为0 47 if(count<0){ 48 count=0; 49 } 50 count++; 51 } 52 53 //线程体 54 public void run() { 55 //消费 56 while(true){ 57 //获取当前线程名字 58 String threadName=Thread.currentThread().getName(); 59 60 //资源处理完毕&&生产者停止生产,则跳出死循环 61 if(count==0&&flag){ 62 break; 63 } 64 65 66 String pollInteger; 67 try { 68 //从队列中获取数据。如果没有数据等待100毫秒,100毫秒后还是无数据,返回null 69 pollInteger = a.poll(100, TimeUnit.MILLISECONDS); 70 71 //如果取出的数据为空,则暂停本次循环,进行下次循环(后边代码不执行) 72 if(pollInteger==null){ 73 continue; 74 } 75 76 //如果队列中资源个数为0,则暂停本次循环,进行下次循环 77 if(count==0||count<0){ 78 continue; 79 } 80 81 //说明从队列中取出数据,队列中数据个数减一 82 count--; 83 84 //获取执行时间点 85 SimpleDateFormat aDateFormat=new SimpleDateFormat("HH:mm:ss SS"); 86 Date date=new Date(); 87 String dateString=aDateFormat.format(date); 88 //模拟消费队列中获取的数据 89 System.out.println("MyThread.run(-->)"+threadName+"【"+pollInteger+"】 时间: "+dateString); 90 } catch (InterruptedException e) { 91 // TODO Auto-generated catch block 92 e.printStackTrace(); 93 } 94 95 } 96 97 //唤醒所有线程 98 synchronized(object){ 99 //唤醒该锁锁住的所有线程【证明没有数据要处理了,main方法中挂起的线程(模拟的网络请求线程)被唤醒,main方法执行结束】 100 object.notifyAll(); 101 String tString=Thread.currentThread().getName(); 102 System.out.println("MyThread.run(-->)"+tString+"notfyAll()"); 103 } 104 105 } 106 107 108 }