利用redis实现定长的线程队列


纯手打,转载务请附上本文网址!!!

Redis -- 首先就不做简介啦,直接上代码和功能

实习需要做到一个功能:利用Redis控制线程个数,包括人工起的线程和自动运行的线程;公司代码不能上,就上自己写的一个小例子吧,附上github地址:https://github.com/xianzhixianzhixian/RedisDemo.git

首先我们有一个长度不定的队列takslist用于接收所有的任务,然后有一个定长的运行任务队列runningtask用于控制正在运行的线程个数(3个)

1、模拟一个生产者进程,用于不断地产生任务

/**
 * Redis生产者进程
 * yufeng on 2018/1/22
 * 优先级高的进程LPUSH-在栈顶,优先级低的进程RPUSH-在栈底;POP采用LPOP,每次只取栈顶元素,
 * 再创建一个map栈满三个的时候LTRIM清空即可
 */
public class Producer implements Runnable{

    public static int i=0;
    Jedis jedis = new Jedis("127.0.0.1",6379);
    public void run() {
        while (true){
            try{
                if(jedis.llen("tasklist")<3){
                    jedis.rpush("tasklist",i+"");
                    System.out.println("rpush tasklist "+i);
                    i++;
                }

            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}
2、模拟一个消费者进程,用于不断地完成任务,相当于线程运行完毕

/**
 * Redis消费者进程
 * yufeng on 2018/1/22
 */
public class Consumer implements Runnable {

    Jedis jedis = new Jedis("127.0.0.1",6379);
    public void run() {
        while (true){
            try{
                if(jedis.llen("tasklist")==3){
                    for(int i=0;i<jedis.llen("tasklist");i++){
                        System.out.println("lindex i "+jedis.lindex("tasklist",i));
                        if(jedis.llen("map")<3) {
                            System.out.println("rpush map "+jedis.lindex("tasklist",i)+" "+ jedis.rpush("map",jedis.lindex("tasklist",i)));
                        }
                        if(jedis.llen("map")==3){
                            System.out.println("ltrim map "+jedis.ltrim("map",2,0));
                        }
                        Thread.sleep(1000L);
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

3、运行程序
/**
 * Redis测试代码
 */
public class Main {

    public static void main(String[] args){
        try {
            Thread producer = new Thread(new Producer());
            Thread consumer = new Thread(new Consumer());

            producer.start();
            consumer.start();

            //主线程休眠
            Thread.sleep(Long.MAX_VALUE);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值