模拟场景: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 }
View Code

相关文章:

  • 2021-05-04
  • 2021-12-09
  • 2021-12-13
  • 2021-09-05
  • 2022-12-23
  • 2022-01-03
  • 2021-07-27
  • 2021-08-13
猜你喜欢
  • 2022-12-23
  • 2021-07-10
  • 2022-12-23
  • 2021-07-25
  • 2021-08-20
  • 2021-07-06
  • 2022-02-18
相关资源
相似解决方案