场景:在开发固件测试项目的时候,遇到一个问题。由于底层跑固件的分析程序是单线程的,b端上层这边是多线程的,这就产生了一个需求,上层需要把测试任务进行排队,然后让底层分析程序一个一个的执行固件的测试。
说明解释:CloudTask是我自定义的实体类。这些代码是从业务中剥离出来的,所以有些没用的我注释掉了。项目中用到了logger工厂,为了方便demo运行我注释掉了,改成了println()输出到控制台。
队列服务类:
import org.springframework.stereotype.Service; import java.util.concurrent.LinkedBlockingQueue; /*** * 队列服务 * @author liujian */ @Service public class QueneService { private static LinkedBlockingQueue<CloudTask> queue = new LinkedBlockingQueue<>(); /** * 获取队列信息 * * @return */ LinkedBlockingQueue<CloudTask> getQueue() { return queue; } }
生产者:
import org.springframework.beans.factory.annotation.Autowired; /** * 生产者 * @author liujian */ public class Producer { @Autowired QueneService queneService; public Producer(QueneService queneService){ this.queneService=queneService; } public void createTask(CloudTask cloudTask){ try { queneService.getQueue().add(cloudTask); }catch (Exception e){ System.out.println("生产者数据添加至队列错误"); } } }
消费者类:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.locks.ReentrantLock; /*** * 消费者 * @author liujian */ public class Consumer { /* protected final Logger logger = LoggerFactory.getLogger(BaseController.class); @Autowired private ICloudTaskService cloudTaskService; @Autowired private ICloudKitService cloudKitService;*/ public Consumer(QueneService queneService) { init(queneService); } // private final ReentrantLock lock = new ReentrantLock(); /*** * 初始化 */ public void init(QueneService queneService) { try { while (true) { CloudTask cloudTask = queneService.getQueue().take(); dealData(cloudTask); } } catch (Exception e) { System.out.println("队列消费处理发生错误"); e.printStackTrace(); } } /** * 消费实现 **/ public void dealData(CloudTask cloudTask) { try { //这里是你的消费数据的使用写的业务逻辑 /* logger.info("[" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "]消费成功:" + JSON.toJSONString(cloudTask));*/ System.out.println("[" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "]消费成功:" + JSON.toJSONString(cloudTask)); } catch (Exception e) { logger.info("处理消费发生错误异常"); } } }
消费者监听线程:
public static void main(String[] args)
{
// System.setProperty("spring.devtools.restart.enabled", "false");
try {
//实例化队列
ConstantPool.queneService=new QueneService();
//开启消费者线程
new Thread(new Runnable() {
@Override
public void run() {
new Consumer( ConstantPool.queneService);
}
}).start();
//实例化生产者,生产者关键代码
Producer producer=new Producer(queneService);
CloudTask cloudTask = new CloudTask();//这是我自定义的实体类,用来放入队列中排队的任务
producer.createTask(cloudTask);
System.out.println("["+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) +"]成功生产:"+ cloudTask.toString());
} catch (Exception e) {
System.out.println("测试发生了错误");
e.printStackTrace();
}
}