当前位置: 移动技术网 > IT编程>开发语言>Java > java实现电脑定时关机的方法

java实现电脑定时关机的方法

2019年07月22日  | 移动技术网IT编程  | 我要评论

新封神榜范冰冰版,谢玲玲,购物街小黑

本文实例讲述了java如何注册成windows服务程序及一个简单的java定时关机程序代码,分享给大家供大家参考。具体方法如下:

一、问题:

最近想找个软件来控制电脑的关机时间,在网上找了几个,都是可视化界面的可以设置具体的关机时间的软件。由于我想编写的关机程序是运行在别人机器上,只能让该机器在晚上17 点到23 点25 分才上网,到了23 点25 分就可以自动关机。为了让别人感觉不到这个软件的“存在”(免得使用者自己关闭定时关机软件),所以我想把关机软件注册为服务的方式,运行在后台。这里介绍下如何利用javaservice 软件把java 程序注册为windows 服务。

二、实现方法:

1. 利用javaservice 注册java 程序为windows 服务

① 下载javaservice
访问网址http://javaservice.objectweb.org/ 下载windows 版本的javaservice 文件,我下载的是javaservice-2.0.10.rar ,目前最新的版本就是“2.0.10 ”。

② 安装javaservice
解压我们下载下来的javaservices 到一个目录,我是解压到目录“d:/software/javaservice-2.0.10 ”下(解压到任何目录都可以,最好别解压到中文目录,省的出现问题 )

③ 编写定时关机代码
1)   类的名字为:
com.test.timer.timershutdownwindows
2)   把编写后的java 文件导出为class 的形式,把导出的类放到目录“d:/software/javaservice-2.0.10/classes/com/test/timer ”下。也就是把导出的com 包放到
“d:/software/javaservice-2.0.10/classes” 目录下。

④ 注册java 程序为windows 服务
进入“d:/software/javaservice-2.0.10 “目录,执行如下命令:

复制代码 代码如下:
javaservice.exe -install myshutdownservice "%java_home%"/jre/bin/server/jvm.dll -djava.class.path="%java_home%"/lib/tools.jar;d:/software/javaservice-2.0.10/classes -start com.test.timer.timershutdownwindows

其中“-install “后面的参数为服务的名称,“-start ”参数后边是要启动的类名,“djava.class.path ”后面参数中的
“d:/software/javaservice-2.0.10/classe ”地址是我的“timershutdownwindows ”类存放的路径,实际应用中修改为自己的classpath 即可。

这里需要注意几点:

1)   “%java_home% ”jdk 目录,如果没有配置jdk 目录,则替换为jdk 的实际绝对地址。

2)   -djava.class.path 是必须的,因为服务启动的时候无法访问系统的classpath 变量,所以必须在这里声明;如果jar 比较多,为避免写的命令过长,我们可以使用“-djava.ext.dirs=jars 所在目录”参数。

3)   服务添加之后,可以在命令行中敲入“services.msc ”命令来查看所有服务,并可以对服务的启动类型(自动启动还是手动启动等)进行修改。

⑤ 测试

1)  启动服务

当我们注册完服务后,我们可以通过命令“net start myshutdownservice ”来启动该服务,服务启动后会在d 盘根目录生成my_shutdown.log 日志文件。

2)  关闭服务

如果我们要关闭服务,可以通过命令“net stop myshutdownservice ”来关闭该服务。

3)  删除服务

当我们想删除该服务时,可以使用命令“sc delete myshutdownservice ”来删除该服务。

2. 定时关机代码

复制代码 代码如下:
package com.test.timer;
import java.io.file;
import java.io.filewriter;
import java.io.ioexception;
import java.io.printwriter;
import java.text.simpledateformat;
import java.util.calendar;
import java.util.date;
public class timershutdownwindows {
    /* 检测是否需要关机的时间间隔 */
    private static long m_ndetectinterval = 5000;
    /* 记录上次检测的时间,以毫秒为单位 */
    private static long m_llastmilliseconds = 0;
    /* 可以使用电脑的最小小时 */
    private static int m_nusepcminhour = 17;
    /* 可以使用电脑的最大小时 */
    private static int m_nusecomputermaxhour = 23;
    /* 如果分钟超过这个时间,则关机计算机 */
    private static int m_nminutes = 25;
    /* 记录日志的文件的保存位置 */
    private static string m_slogfile = "d:" + file.separator
           + "my_shutdown.log";
    /* 记录当前系统是否已经启动自动关闭程序 */
    private static boolean bhasshutdownpc = false;
    /**
      * @param args
      */
    public static void main(string[] args) {
       // 1. 单独开启一个线程去检测
       thread athread = new thread(new timerdetector());
       athread.start();
    }
    /**
      * 定义内部类
      *
      * @author administrator
      *
      */
    static class timerdetector implements runnable {
       /*
         * (non-javadoc)
         *
         * @see java.lang.runnable#run()
         */
       public void run() {
           // 1. 获取日志文件
           printwriter out = null;
           simpledateformat df = new simpledateformat("yyyy-mm-dd hh:mm:ss");
           try {
              out = new printwriter(new filewriter(m_slogfile, true), true);
           } catch (ioexception e1) {
              out = null;
              e1.printstacktrace();
           }
           // 2. 记录服务启动时间
           appendlog(out, " 服务启动时间:" + df.format(new date()));
           while (true) {
              // 1. 判断当前系统时间是否被修改过
              boolean bshoudshutdownpc = validateshoudshutdownpc(out);
              if (bshoudshutdownpc) {
                  // 验证没通过,强制关机
                  exectueshutdown(out);
              } else {
                  bhasshutdownpc = false;
              }
              // 2. 当前线程休眠下
              try {
                  thread.sleep(m_ndetectinterval);
              } catch (interruptedexception e) {
                  appendlog(out, e.getmessage());
              }
           }
       }
       /**
         * 验证当前时间是否是需要关机的时间
         *
         * @return
         */
       private boolean validateshoudshutdownpc(printwriter _out) {
           // 1. 判断是否修改了系统时间
           boolean bhasmodifysystemtime = detectmodifysytemtime(_out);
           appendlog(_out, "bhasmodifysystemtime :" + bhasmodifysystemtime);
           if (bhasmodifysystemtime) {
              return bhasmodifysystemtime;
           }
           // 2. 没有修改系统时间,则判断当前时间是否超过了指定的时间
           boolean bshoudsleep = nowissleeptime();
           appendlog(_out, "bshoudsleep :" + bshoudsleep);
           if (bshoudsleep) {
              return bshoudsleep;
           }
           return false;
       }
       /**
         * 判断当前时间是否应该休息的时间
         *
         * @return
         */
       private boolean nowissleeptime() {
           // 1. 获取当前小时和分钟
           calendar acalendar = calendar.getinstance();
           int nhour = acalendar.get(calendar.hour_of_day);
           int nminute = acalendar.get(calendar.minute);
           // 2. 判断当前小时是否在可以使用pc 的时间内, 最大小时为23
           if (nhour < m_nusepcminhour) {
              return true;
           }
           // 23 点需要单独判断,超过23 点30 就应该休息
           if ((nhour >= m_nusecomputermaxhour) && (nminute >= m_nminutes)) {
              return true;
           }
           // 3. 非休息时间
           return false;
       }
       /**
         * 判断是否有人修改了系统时间,如果有人修改了系统时间返回true ,<br>
         * 否则返回false
         *
         * @return
         */
       private boolean detectmodifysytemtime(printwriter _out) {
           // 1. 第一次检测系统时间
           if (m_llastmilliseconds == 0) {
              m_llastmilliseconds = system.currenttimemillis();
              return false;
           }
           // 2. 检测两次时间的差值
           long linteral = system.currenttimemillis() - m_llastmilliseconds;
           linteral = math.abs(linteral);
           // 3. 判断两次的时间间隔, 两次结果不一定完全等于 m_ndetectinterval ,允许误差为1 分钟
           long lmaxinterval = m_ndetectinterval + 60 * 1000;
           appendlog(_out, "linteral :::" + linteral);
           appendlog(_out, "lmaxinterval :::" + lmaxinterval);
           if (linteral > lmaxinterval) {
              // 有人修改了系统时间,强制关机
              return true;
           }
           // 4. 只有没人修改时间才记录上次检测时间
           m_llastmilliseconds = system.currenttimemillis();
           return false;
       }
       /**
         * 在指定的流中写入日志信息
         *
         * @param _outwriter
         * @param _sappendcontent
         */
       private void appendlog(printwriter _outwriter, string _sappendcontent) {
           if (_outwriter == null) {
              return;
           }
           _outwriter.println(_sappendcontent);
       }
       /**
         * 执行关机命令
         */
       private void exectueshutdown(printwriter _out) {
           if (bhasshutdownpc) {
              simpledateformat df = new simpledateformat(
                     "yyyy-mm-dd hh:mm:ss");
              appendlog(_out, " 系统即将关闭, 当前时间:" + df.format(new date()));
              return;
           }
           appendlog(_out, " 有人修改了系统时间,系统强制关机!");
           // 关机
           try {
              runtime.getruntime().exec(
                     "shutdown -s -t 120 -c /" 很晚了,该睡觉了,2 分钟后关闭计算机。/"");
           } catch (ioexception e) {
              appendlog(_out, e.getmessage());
           }
           bhasshutdownpc = true;
       }
    }
}

希望本文所述对大家的java程序设计有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网