利用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

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();
        }
    }
}

运行结果:

利用redis实现定长的线程队列_第1张图片

你可能感兴趣的:(Java)