Java调用脚本实现线程不卡住的sleep

在Java开发中遇到需要延时的操作时通常都是java.lang.Thread.sleep(long millis)进行延时,但是这种方式线程会卡住,如何既不卡住线程又能实现延时呢?这个时候可以使用Runtime.getRuntime().exec("").waitFor();配合外部脚本实现不卡住的sleep。

在Windows环境下可以通过调用vbs脚本利用WScript.sleep 1000实现毫秒级别的延时。

在Linux环境下可以通过调用sleep命令实现延时,但是sleep单位是秒级的,如果要实现毫秒级可以通过0.02这种以小数的方式添加参数。

package me.kagura.util;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * java调用脚本实现sleep
 * 由于是调用脚本所以会比实际sleep会比参数多一些
 */
public class SleepTest {

    static String script = System.getProperty("java.io.tmpdir") + "sleep.vbs";
    static boolean isWin = System.getProperty("os.name").toLowerCase().startsWith("windows");

    public static void main(String[] args) {
        sleep(1000);//毫秒
    }

    /**
     * 执行系统对应的脚本进行sleep操作,单位毫秒
     *
     * @param ms
     */
    public static void sleep(int ms) {
        try {
            if (isWin) {
                sleepWin(ms);
            } else {
                sleepLinux(ms);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 调用Linux命令sleep,单位毫秒
     *
     * @param ms
     * @throws IOException
     * @throws InterruptedException
     */
    private static void sleepLinux(int ms) throws IOException, InterruptedException {
        Runtime.getRuntime().exec("sleep " + ms * 0.001).waitFor();
    }

    /**
     * 调用vbs脚本sleep,单位毫秒
     *
     * @param ms
     * @throws IOException
     * @throws InterruptedException
     */
    private static void sleepWin(int ms) throws IOException, InterruptedException {
        if (!new File(script).exists()) {
            FileWriter fileWriter = new FileWriter(script);
            fileWriter.write("WScript.sleep WScript.Arguments(0)");
            fileWriter.flush();
            fileWriter.close();
        }
        String cmd = String.format("CScript.exe %s %d >nul", script, ms);
        Runtime.getRuntime().exec(cmd).waitFor();
    }

}

未经允许不得转载:鹞之神乐 » Java调用脚本实现线程不卡住的sleep

赞 (0) 打赏

评论

4+4=

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏