队列写入mysql

  写了一个队列写入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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值