纯手打,转载务请附上本文网址!!!
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();
}
}
}
运行结果: