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]人 - [李四, 張三]