在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();
}
}