zoukankan      html  css  js  c++  java
  • scheduleAtFixedRate 和 timer 执行对比

    自由自在

    main

    package com.adao.simulater.socket;
    /**
     * 客户端测试类
     * 
     * @author adao 2020-06-22
     */
    public class socketClientTest {
    public static Socket client;
        
        private static ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10);
    
        public static void main(String[] args) throws IOException {
    
            client = ClientManager.getConnect();
            long terminalId = Long.parseLong("1000000000001");long delay = 1000 * 5; // 时延
                long period = 1000 * 1; // 频率
            for (int j = 0; j < 1000; j++) {
            if (client.isConnected()) {
                keepAlive(client, terminalId, period);
    //            heartbeatTask(client, terminalId, delay, period);
    
            }
            terminalId++;
            }
        }
    
        public static void keepAlive(Socket client, Long terminalId, long period) {
            Thread keepAliveThread = new Thread(new KeepAliveThread(client, terminalId, period));
            // 延迟10秒执行心跳线程
            threadPool.scheduleAtFixedRate(keepAliveThread, 10000, period, TimeUnit.MILLISECONDS);
        }
        
        public static void heartbeatTask(Socket client, Long terminalId, long delay, long period) {
            Timer timer = new Timer();
            timer.schedule(new HeartbeatTask(client, terminalId), delay, period);
        }
    
    }

    KeepAliveThread

    package com.adao.simulater.socket;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    
    import org.apache.log4j.Logger;
    
    /**
     * 客户端心跳
     * 
     * @author Adao 2020-06-29
     */
    public class KeepAliveThread implements Runnable {
        private final static Logger logger = Logger.getLogger(KeepAliveThread.class);
    
        private KeepAliveThread() {
        }
    
        public KeepAliveThread(Socket cleint, long terminalId, long period) {
            this.client = cleint;
            this.terminalId = terminalId;
        }
    
        Socket client;
        long terminalId;
    
        public void run() {
            try {
                if (client.isConnected()) {
                    OutputStream os = client.getOutputStream();
                    logger.info("终端ID : " + terminalId + ", 发送心跳报文." + " name:" + Thread.currentThread().getName());
                    os.write("send heart beat data package !".getBytes());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }

    HeartbeatTask

    package com.linyang.simulater.task;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.util.TimerTask;
    
    import org.apache.log4j.Logger;
    
    public class HeartbeatTask extends TimerTask {
        private final static Logger logger = Logger.getLogger(HeartbeatTask.class);
        public Socket client;
        public long terminalId;
    
        public HeartbeatTask(Socket cleint, long terminalId) {
            this.client = cleint;
            this.terminalId = terminalId;
        }
    
        OutputStream os = null;
    
        @Override
        public void run() {
            try {
                if (client.isConnected()) {
                    os = client.getOutputStream();
                    logger.info("终端ID : " + terminalId + ", 发送心跳报文." + " name:" + Thread.currentThread().getName());
                    os.write("send heart beat data package !".getBytes());
                    os.flush();
                } else {
                    logger.info("终端ID : " + terminalId + ", socket未连接.");
                }
            } catch (IOException e) {
                e.printStackTrace();
                logger.error("获取连接失败." + e);
            }
    
        }
    
    }

    ClientManager

    package com.adao.simulater.socket;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.net.Socket;
    import java.util.Properties;
    
    import org.apache.log4j.Logger;
    
    import com.linyang.simulater.common.PropertiesUtil;
    import com.linyang.simulater.util.StrUtil;
    
    /**
     * 
     * 负责客户端管理
     *
     */
    public class ClientManager {
        private final static Logger logger = Logger.getLogger(ClientManager.class);
    
        public static Socket client;
    
        public static Socket getClient() {
            return client;
        }
    
    
        /**
         * 创建socket连接
         */
        public static Socket getConnect() {
    
            ClientManager.checkPort(serverPort);
            serverAddress = ClientManager.checkIp(serverAddress);
    
            try {
                client = new Socket();
                client.connect(new InetSocketAddress("127.0.0.1", 3000), 3000);
                logger.info("Socket客户端连接成功 : " + client);
            } catch (IOException e) {
                logger.error("Socket客户端连接失败!", e);
            }
    
            return client;
    
        }
    
        public static void disconnect() {
            // 关闭所有服务
            if (client != null && client.isConnected()) {
                try {
                    client.shutdownOutput();
                    client.shutdownInput();
                    client.getOutputStream().close();
                    client.getInputStream().close();
                    client.close();
                } catch (IOException e) {
                    logger.error(e);
                }
            }
    
        }
    
        public static void checkPort(int port) {
            if (port < 1 || port > 65534) {
                logger.error("端口配置错误,超出范围[1,65534], 程序终止启动。");
                System.exit(0);
            }
        }
    
        public static String checkIp(String ipAddr) {
            if (null == ipAddr || "".equals(ipAddr.trim())) {
                ipAddr = "127.0.0.1";
            } else {
                if (!StrUtil.isIp(ipAddr)) {
                    logger.error("服务端IP设置错误,程序终止启动");
                    System.exit(0);
                }
            }
            return ipAddr;
        }
    
    }

    执行结果:

    线程

    timer

     从执行结果可以看出 线程消耗cpu更高,不知道有大神给解释一下没,在其他帖子看到推荐用线程比任务要快

    不完美

  • 相关阅读:
    并发编程3
    并发编程2
    4/23
    4/22
    并发编程1
    粘包问题
    Navicat12激活
    IDEA创建maven项目报错解决:Failed to create a Maven project: 'C:/Users/../IdeaProjects/../pom.xml' already e
    IDEA
    windows下查看端口运行情况--解决端口冲突问题
  • 原文地址:https://www.cnblogs.com/adao21/p/13226393.html
Copyright © 2011-2022 走看看