【JUC】ExecutorsのnewSingleThreadScheduledExecutor応用シーン:部門リーダーpingipは学生たちがすでに職場に着いたかどうかを判断する


ExecutorsのnewSingleThreadScheduledExecutor応用シーン1:部門の指導者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
"
, 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 ...
"
, 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]  - [  ,   ]