【JUC】Executors 之 newSingleThreadScheduledExecutor 应用场景:部门领导 ping ip 判断同学们是否已到工位

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

猜你喜欢

转载自blog.csdn.net/AV_woaijava/article/details/106402819
今日推荐