场景:多个设备需要定时任务,且定时的时间为手动输入,随时可改 如设备1 , 10分钟后启动,其他人改成1分钟后启动等。
jar:jedis-2.9.0.jar,jdk1.8
引入jedis
package time; import redis.clients.jedis.Jedis; public class MyJedis { public static Jedis getJedis() { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.auth("123456"); return jedis; } } 线程 Thread package time; import redis.clients.jedis.Jedis; import java.text.SimpleDateFormat; import java.util.Date; public class MyRun implements Runnable { private long time; private String name; private String value; public MyRun(long time, String name, String value) { this.time = time; this.name = name; this.value = value; } @Override public void run() { Jedis jedis = MyJedis.getJedis(); try { Thread.currentThread().setName(name); System.out.print(Thread.currentThread().getName() + "-得到命令,开始执行----"); printTime(); Thread.sleep(time); if (jedis.get(name) == null) { System.out.print(name + "--该线程已被执行"); printTime(); } //遇到key/value不一致的不执行 if (jedis.get(name).equals(value)) { String result = new RunService().doSomething(); System.out.println(name + "-" + result); System.out.print(Thread.currentThread().getName() + "-命令执行完成,回应结果----success"); printTime(); jedis.del(name); if (jedis.get(name) == null) { System.out.println(name + "-已清理"); } } else { System.out.print(Thread.currentThread().getName() + "-命令执行完成,回应结果----fail"); printTime(); } } catch (InterruptedException e) { System.out.println("线程被终止"); } finally { Thread.interrupted(); } } public void printTime() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("--------" + sdf.format(new Date())); } }启动类 package time; import redis.clients.jedis.Jedis; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class RunService { private static ExecutorService pool = Executors.newCachedThreadPool(); Jedis jedis = MyJedis.getJedis(); public String doSomething() { return "do something"; } /** * @param time 定时时间 * @param name 定时设备名 前后保持一致 */ public Future<?> run(long time, String name) { //第一次请求 String value = "0"; if (jedis.get(name) == null) { jedis.set(name, value); } else { value = Integer.parseInt(jedis.get(name)) + 1 + ""; jedis.set(name, value); } MyRun run = new MyRun(time, name, value); return pool.submit(run); } /** * 取消该设备的定时操作 */ public void cancel(String name) { jedis.del(name); } public static void main(String[] args) { RunService service = new RunService(); try { service.run(30000, "loupai"); Thread.sleep(1000); service.run(10000, "loupai"); Thread.sleep(1000); service.run(30000, "loupai"); Thread.sleep(1000); service.run(20000, "loupai"); service.cancel("loupai"); } catch (InterruptedException e) { e.printStackTrace(); } } }