A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

定义工具类
public class CommandUtils{
        /**
        * command 要执行的文件或命令   call回调函数
        **/
        public static void exec(String command,ICommandCall call){
                try{
                        if(StringUtils.isEmpty(command)){
                                log.error("没有要执行的命令。。");
                                return;
                        }
                        StringBuffer cmd = new StringBuffer();
                        //获取操作系统标识
                        String osName = System.getProperty(os.name);
                        if(os.startsWith(Window)){
                                //window实现(应用比较少 不展示具体内容)
                        }else if(osName.equals("Linux")){
                                //linux实现
                                cmd.append("sh ");
                                cmd.append(command);
                                cmd.append(" &");
                        }
                        String cmds = cmd.toString();
                        log.info("启动执行:"+cmds);
                        Process process = Runtime.getRuntime().exec(cmds);
                        printMessage(process.getInputStream(),call);
                        int waitFor = process.waitFor();
                        log.info("waitFor:"+waitFor);
                        process.destroy();
                }catch(Exception e){
                        log.error(e.getMessage(),e);
                }
    }

        //读取输入流方法
        static void printMessage(final InputStream inputStream,ICommand call){
                Thread thread = new Thread(new Runnable(){
                        @override
                        public void run(){
                                try{
                                        //获取当前时间点
                                        Instant start = DateUtils.instant();
                                        Reader reader = new InputSteamReader(inputSteam);
                                        BufferedReader bufferedReader = new BufferedReader(reader);
                                        String line = "";
                                        while((line = befferedReader.readLine()) != null){
                                                log.info(line);
                                                //获取两分钟之后的时间点
                                                Long durationMinutes = DateUtils.getDurationMinues(start,DateUtils.minute);
                                                //判断当前时间点是否大于两分钟
                                                if(durationMinutes == Long.valueOf(2)){
                                                        log.info("调用超时。。");
                                                        break;
                                                }else{
                                                        //执行调用逻辑
                                                        if(StringUtils.contains(line,"stop success")){
                                                                //接受到返回值命令退出 并处理相对应的业务逻辑
                                                                break;                                                 
                                                        }
                                                }
                                        }
                                        if(call != null){
                                                 //如果定义了回调函数 执行
                                                call.call();
                                        }
                                        //关闭流
                                        bufferedReader.close();
                                }catch(){
                                        log.error("异常:"+e.getMessage());
                                }
                        }
                });
                thread.start();
                thread.join();  //阻塞主线程 等待主线程执行完
        }
}
外汇常见问题https://www.fx61.com/faq

注意: 定义工具类时可根据自身需要,是否选择处理多线程问题,是否需要返回值决定回调函数进行哪些封装需要,一定要设置超时时间避免线程无法退出!

使用
public void test(){
        Thread t = new Thread(()->{
                //以linux路径 为例,启动某个tomcat服务
                CommandUtils.exec("/data/test/start.sh",null);
        });
        t.start();
        t.join();
}
1
2
3
4
5
6
7
8
通过线程触发不影响方法整体返回值,对子线程进行阻塞,如果超时子线程也会进行退出,不影响上层方法的调用。

时间工具类
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;

public class DateUtils {

        public static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        public static final SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        public static final String minute = "Minute";
        public static final String millis = "Millis";
        public static final String hours = "Hours";

        public static void main(String[] args) {
                SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String dt1 = getCurrentLocalDateTime().format(DATETIME_FORMATTER);
                try {
                        Thread.sleep(5000);
                        String dt2 = getCurrentLocalDateTime().format(DATETIME_FORMATTER);
                        Instant start = sd.parse(dt1).toInstant();
                        Instant end = sd.parse(dt2).toInstant();
                        System.out.println(durationMinutes(start, end) == Long.valueOf(1));
                        long durationMillis = durationMillis(start, end);
                        System.out.println(durationMillis);
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

    //获取当前时间转换为Instant类型
        public static Instant instant() throws ParseException {
                String dt = getCurrentLocalDateTime().format(DATETIME_FORMATTER);
                return sd.parse(dt).toInstant();
        }

        public static Long getDurationMinutes(Instant start, String type) throws ParseException {
                Instant end = instant();
                Long duration = null;
                if (StringUtils.equals(minute, type)) {
                        duration = DateUtils.durationMinutes(start, end);
                } else if (StringUtils.equals(millis, type)) {
                        duration = DateUtils.durationMillis(start, end);
                }
                return duration;
        }

        /**
         * 返回当前的日期
         *
         * @return
         */
        public static LocalDate getCurrentLocalDate() {
                return LocalDate.now();
        }

        /**
         * 返回当前日期时间
         *
         * @return
         */
        public static LocalDateTime getCurrentLocalDateTime() {
                return LocalDateTime.now();
        }

        /**
         * 返回当前日期字符串 yyyyMMdd
         *
         * @return
         */
        public static String getCurrentDateStr() {
                return LocalDate.now().format(DATE_FORMATTER);
        }

        /**
         * 返回当前日期时间字符串 yyyyMMddHHmmss
         *
         * @return
         */
        public static String getCurrentDateTimeStr() {
                return LocalDateTime.now().format(DATETIME_FORMATTER);
        }

        public static LocalDate parseLocalDate(String dateStr, String pattern) {
                return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
        }

        public static LocalDateTime parseLocalDateTime(String dateTimeStr, String pattern) {
                return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern(pattern));
        }

        /**
         * 日期相隔天数
         *
         * @param startDateInclusive
         * @param endDateExclusive
         * @return
         */
        public static int periodDays(LocalDate startDateInclusive, LocalDate endDateExclusive) {
                return Period.between(startDateInclusive, endDateExclusive).getDays();
        }

        /**
         * 日期相隔小时
         *
         * @param startInclusive
         * @param endExclusive
         * @return
         */
        public static long durationHours(Temporal startInclusive, Temporal endExclusive) {
                return Duration.between(startInclusive, endExclusive).toHours();
        }

        /**
         * 日期相隔分钟
         *
         * @param startInclusive
         * @param endExclusive
         * @return
         */
        public static long durationMinutes(Temporal startInclusive, Temporal endExclusive) {
                return Duration.between(startInclusive, endExclusive).toMinutes();
        }

        /**
         * 日期相隔毫秒数
         *
         * @param startInclusive
         * @param endExclusive
         * @return
         */
        public static long durationMillis(Temporal startInclusive, Temporal endExclusive) {
                return Duration.between(startInclusive, endExclusive).toMillis();
        }

        /**
         * 是否当天
         *
         * @param date
         * @return
         */
        public static boolean isToday(LocalDate date) {
                return getCurrentLocalDate().equals(date);
        }

        /**
         * 获取本月的第一天
         *
         * @return
         */
        public static String getFirstDayOfThisMonth() {
                return getCurrentLocalDate().with(TemporalAdjusters.firstDayOfMonth()).format(DATE_FORMATTER);
        }

        /**
         * 获取本月的最后一天
         *
         * @return
         */
        public static String getLastDayOfThisMonth() {
                return getCurrentLocalDate().with(TemporalAdjusters.lastDayOfMonth()).format(DATE_FORMATTER);
        }

        /**
         * 获取2017-01的第一个周一
         *
         * @return
         */
        public static String getFirstMonday() {
                return LocalDate.parse("2017-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY))
                                .format(DATE_FORMATTER);
        }

        /**
         * 获取当前日期的后两周
         *
         * @return
         */
        public static String getCurDateAfterTwoWeek() {
                return getCurrentLocalDate().plus(2, ChronoUnit.WEEKS).format(DATE_FORMATTER);
        }

        /**
         * 获取当前日期的6个月后的日期
         *
         * @return
         */
        public static String getCurDateAfterSixMonth() {
                return getCurrentLocalDate().plus(6, ChronoUnit.MONTHS).format(DATE_FORMATTER);
        }

        /**
         * 获取当前日期的5年后的日期
         *
         * @return
         */
        public static String getCurDateAfterFiveYear() {
                return getCurrentLocalDate().plus(5, ChronoUnit.YEARS).format(DATE_FORMATTER);
        }

        /**
         * 获取当前日期的20年后的日期
         *
         * @return
         */
        public static String getCurDateAfterTwentyYear() {
                return getCurrentLocalDate().plus(2, ChronoUnit.DECADES).format(DATE_FORMATTER);
        }

        /**
         * 字符串转时间
         *
         * @return
         */
        public static LocalDate stringToDate(String time) {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                return LocalDate.parse(time, formatter);
        }

        public static Long getLongTime() {
                return new Date().getTime();
        }

}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马