【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]- [李四, 張三]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章