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更高,不知道有大神给解释一下没,在其他帖子看到推荐用线程比任务要快

不完美

 

posted @ 2020-07-02 18:40  adao  阅读(334)  评论(0编辑  收藏  举报