Executors 之 newSingleThreadScheduledExecutor
应用场景一:部门领导 ping ip 判断同学们是否已到工位
就问你这招狠不狠?这应用场景都能想出来,还有谁?
talk is cheap, show me the code.
PingIP.java
package com.iptlh.tools;
import java.io.IOException;
import java.net.InetAddress;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
* @author: tanpeng
* @since: 2020-05-28 10:08
*/
public class PingIP {
private static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
private static LocalTime latestTime = LocalTime.of(14, 0);
private static HashMap<String, String> allIP = new HashMap<>();
private static Set<String> offlineIP;
static {
allIP.put("192.168.0.152", "王二");
allIP.put("192.168.0.153", "张三");
allIP.put("192.168.0.154", "李四");
allIP.put("192.168.0.126", "赵六");
allIP.put("192.168.0.87" , "孙七");
allIP.put("192.168.0.88" , "周八");
allIP.put("192.168.0.199", "罗九");
// 默认所有IP均为离线
offlineIP = allIP.keySet();
}
public static void main(String[] args) {
if (LocalTime.now().isAfter(latestTime)) {
System.out.println("亲现在已经是正式上班时间了呢!会不会是你迟到了呢?(*^__^*) 嘻嘻");
return;
}
ScheduledExecutorService singleThreadScheduledPool = Executors.newSingleThreadScheduledExecutor();
singleThreadScheduledPool.scheduleAtFixedRate(() -> {
if (offlineIP.isEmpty() || LocalTime.now().isAfter(latestTime)) {
singleThreadScheduledPool.shutdown();
System.out.format("[%s] 迟到的同学共[%s]人 - %s",
dateTimeFormatter.format(LocalDateTime.now()),
offlineIP.size(),
offlineIP.stream().map(ip -> allIP.get(ip)).collect(Collectors.toList()).toString());
} else {
pingOfflineIP(offlineIP);
System.out.format("[%s] 未上线同学共[%s]人 - %s\n",
dateTimeFormatter.format(LocalDateTime.now()),
offlineIP.size(),
offlineIP.stream().map(ip -> allIP.get(ip)).collect(Collectors.toList()).toString());
System.out.println();
}
}, 1, 10, TimeUnit.SECONDS);
}
/**
* 核心业务
* ping离线IP
*
* @param ipList
*/
private static void pingOfflineIP(Collection<String> ipList) {
// IP可达性断言
Predicate<String> isReachable = ip -> {
try {
InetAddress inetAddress = InetAddress.getByName(ip);
return inetAddress.isReachable(1000);
} catch (IOException e) {
e.printStackTrace();
}
return false;
};
Set<String> onlineIP = ipList.stream().filter(isReachable).collect(Collectors.toSet());
// 发送IP上线通知
onlineIP.forEach(PingIP::notice);
// 已上线IP断言
Predicate<String> isOnlineIP = onlineIP::contains;
// 更新离线IP
offlineIP = ipList.stream().filter(isOnlineIP.negate()).collect(Collectors.toSet());
}
/**
* 发送上线通知
*
* @param ip
*/
private static void notice(String ip) {
System.out.format("[%s] %s(%s)\t 已上线...\n",
dateTimeFormatter.format(LocalDateTime.now()),
allIP.get(ip), ip);
}
}
控制台输出
[2020/05/28 13:18:20] 孙七(192.168.0.87) 已上线...
[2020/05/28 13:18:20] 赵六(192.168.0.126) 已上线...
[2020/05/28 13:18:20] 罗九(192.168.0.199) 已上线...
[2020/05/28 13:18:20] 王二(192.168.0.152) 已上线...
[2020/05/28 13:18:20] 未上线同学共[3]人 - [周八, 李四, 张三]
[2020/05/28 13:18:27] 未上线同学共[3]人 - [周八, 李四, 张三]
[2020/05/28 13:18:39] 周八(192.168.0.88) 已上线...
[2020/05/28 13:18:39] 未上线同学共[2]人 - [李四, 张三]
[2020/05/28 13:18:49] 未上线同学共[2]人 - [李四, 张三]
[2020/05/28 13:18:59] 未上线同学共[2]人 - [李四, 张三]
...
[2020/05/28 14:00:01] 迟到的同学共[2]人 - [李四, 张三]