队列写入mysql
来源:互联网 发布:会计核算软件以模块 编辑:程序博客网 时间:2024/06/16 22:53
写了一个队列写入Mysql的例子,具体操作Mysql没写,如有错误请指正。
队列实现有两个择,一个是redis的队列一个是Java自带的阻塞队列。
这里我选择用阻塞队列实现一下。创建一个用于管理阻塞队列的 管理类,这里我选择了静态的ConcurrentHashMap用于统一管理(其实这里用HashMap就好反正用了同步,但是自己习惯多线程就用这个,呵呵 )
public class BlockQueue { private static ConcurrentHashMap<String, BlockingQueue<?>> map=new ConcurrentHashMap<>(); @SuppressWarnings("unchecked") public static synchronized <T> BlockingQueue<T> getQueue(Class<T> tClass){ if(map.containsKey(tClass.getName())){ return (BlockingQueue<T>) map.get(tClass.getName()); }else{ BlockingQueue<T> queue=new LinkedBlockingQueue<>(); map.put(tClass.getName(), queue); return queue; } }}
在创抽象类,实现每个队列都必须先继承这个抽象类。
关于具体实现持久化操作,也就是于put里面的这个线程我想了好久。还有一个其它,放在while死循环里头使得线程不会终止。
关于泛型获取T.cass
传送门:http://www.blogjava.net/calvin/archive/2009/12/10/43830.html
public abstract class AbstractQueue<T>{ private BlockingQueue<T> queue=null; private Thread thread=null; @SuppressWarnings("unchecked") public AbstractQueue() { Class<T> tClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; queue=BlockQueue.getQueue(tClass); } protected void put(T t){ try { queue.put(t); if(thread==null||!thread.isAlive()){ thread=new Thread(new Runnable() { @Override public void run() { boolean flag=true; while(flag){ T take=take(); if(take!=null){ System.out.println("出队列:"+take); persistence(take); }else{ System.out.println("队列为空线程关闭!"); flag=false; } } } }); thread.start(); } } catch (InterruptedException e) { e.printStackTrace(); } } protected T take(){ try { T take=queue.poll(3,TimeUnit.SECONDS); return take; } catch (InterruptedException e) { e.printStackTrace(); } return null; } abstract public void persistence(T t);}
接下来就是实现这个抽象类具体完成队列操作了
设置线程延迟五秒是想看看处理队列的线程,如果队列为空会不会停止以及新的数据写入线程会不会重启。
这个实现类感觉是最大的败笔,为了不让每一次push都创建一个对象,不得已弄了一个单例模式(这个也不算单例模式没写获取实例的方法,哈哈)
public class BlockQueuTest extends AbstractQueue<String> { public static BlockQueuTest block=new BlockQueuTest(); private BlockQueuTest() { } @Override public void persistence(String t) { System.out.println("消费:"+t); } public static void push(String t){ block.put(t); } public static void main(String[] args) { System.out.println("————————Block队列————————"); BlockQueuTest.push("矿泉水一瓶"); try { Thread.sleep(5000); BlockQueuTest.push("辣条一包"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
具体运行结果:
redis队列写入的以及具体代码
传送门:http://download.csdn.net/detail/qq_31650563/9827503
0 0
- 队列写入mysql
- log4j写入mysql数据库
- MySQL写入中文乱码
- mysql写入中文乱码
- mysql写入中文乱码
- python MySQL 写入excel
- 写入mysql数据库
- python写入mysql乱码
- Python 写入MySQL乱码
- mysql无法写入中文
- log4J2写入mysql
- 队列方式的异步写入数据模式
- Mysql--将图片写入数据库
- mysql将图片写入数据库
- 关于Mysql怎么写入日文
- Mysql 汉字写入乱码解决
- MySQL 写入中文乱码问题
- mysql 图片数据的写入
- Java进阶(十三)servlet监听器
- 畅通工程再续
- 深入理解Objective C的ARC机制
- 线性表的链式表示和实现
- Makefile学习笔记
- 队列写入mysql
- Groovy解析json
- 多线程串口通信
- Android中的JSON解析
- 题目1466:排列与二进制
- Android开发技巧之五分钟实现二维码识别(进阶版)
- epoll的LT,ET模式
- JavaWeb日记——Shiro之密码加密
- 关于Android 5.x的低功耗蓝牙BLE开发简介