免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3175 | 回复: 0

java实现电脑定时关机的方法 [复制链接]

论坛徽章:
2
丑牛
日期:2014-05-15 09:31:39IT运维版块每日发帖之星
日期:2016-08-19 06:20:00
发表于 2015-05-26 14:30 |显示全部楼层
本帖最后由 yuanxueming 于 2015-05-26 14:30 编辑

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

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

二、实现方法:

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

① 下载javaService


② 安装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 “目录,执行如下命令:
  1. 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. 定时关机代码
  1. package com.test.timer;
  2. import java.io.File;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9. public class TimerShutDownWindows {
  10.     /* 检测是否需要关机的时间间隔 */
  11.     private static long m_nDetectInterval = 5000;
  12.     /* 记录上次检测的时间,以毫秒为单位 */
  13.     private static long m_lLastMilliSeconds = 0;
  14.     /* 可以使用电脑的最小小时 */
  15.     private static int m_nUsePCMinHour = 17;
  16.     /* 可以使用电脑的最大小时 */
  17.     private static int m_nUseComputerMaxHour = 23;
  18.     /* 如果分钟超过这个时间,则关机计算机 */
  19.     private static int m_nMinutes = 25;
  20.     /* 记录日志的文件的保存位置 */
  21.     private static String m_sLogFile = "D:" + File.separator
  22.            + "my_shutdown.log";
  23.     /* 记录当前系统是否已经启动自动关闭程序 */
  24.     private static boolean bHasShutDownPC = false;
  25.     /**
  26.       * @param args
  27.       */
  28.     public static void main(String[] args) {
  29.        // 1. 单独开启一个线程去检测
  30.        Thread aThread = new Thread(new TimerDetector());
  31.        aThread.start();
  32.     }
  33.     /**
  34.       * 定义内部类
  35.       *
  36.       * @author Administrator
  37.       *
  38.       */
  39.     static class TimerDetector implements Runnable {
  40.        /*
  41.          * (non-Javadoc)
  42.          *
  43.          * @see java.lang.Runnable#run()
  44.          */
  45.        public void run() {
  46.            // 1. 获取日志文件
  47.            PrintWriter out = null;
  48.            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  49.            try {
  50.               out = new PrintWriter(new FileWriter(m_sLogFile, true), true);
  51.            } catch (IOException e1) {
  52.               out = null;
  53.               e1.printStackTrace();
  54.            }
  55.            // 2. 记录服务启动时间
  56.            appendLog(out, " 服务启动时间:" + df.format(new Date()));
  57.            while (true) {
  58.               // 1. 判断当前系统时间是否被修改过
  59.               boolean bShoudShutDownPC = validateShoudShutDownPC(out);
  60.               if (bShoudShutDownPC) {
  61.                   // 验证没通过,强制关机
  62.                   exectueShutDown(out);
  63.               } else {
  64.                   bHasShutDownPC = false;
  65.               }
  66.               // 2. 当前线程休眠下
  67.               try {
  68.                   Thread.sleep(m_nDetectInterval);
  69.               } catch (InterruptedException e) {
  70.                   appendLog(out, e.getMessage());
  71.               }
  72.            }
  73.        }
  74.        /**
  75.          * 验证当前时间是否是需要关机的时间
  76.          *
  77.          * @return
  78.          */
  79.        private boolean validateShoudShutDownPC(PrintWriter _out) {
  80.            // 1. 判断是否修改了系统时间
  81.            boolean bHasModifySystemTime = detectModifySytemTime(_out);
  82.            appendLog(_out, "bHasModifySystemTime :" + bHasModifySystemTime);
  83.            if (bHasModifySystemTime) {
  84.               return bHasModifySystemTime;
  85.            }
  86.            // 2. 没有修改系统时间,则判断当前时间是否超过了指定的时间
  87.            boolean bShoudSleep = nowIsSleepTime();
  88.            appendLog(_out, "bShoudSleep :" + bShoudSleep);
  89.            if (bShoudSleep) {
  90.               return bShoudSleep;
  91.            }
  92.            return false;
  93.        }
  94.        /**
  95.          * 判断当前时间是否应该休息的时间
  96.          *
  97.          * @return
  98.          */
  99.        private boolean nowIsSleepTime() {
  100.            // 1. 获取当前小时和分钟
  101.            Calendar aCalendar = Calendar.getInstance();
  102.            int nHour = aCalendar.get(Calendar.HOUR_OF_DAY);
  103.            int nMinute = aCalendar.get(Calendar.MINUTE);
  104.            // 2. 判断当前小时是否在可以使用PC 的时间内, 最大小时为23
  105.            if (nHour < m_nUsePCMinHour) {
  106.               return true;
  107.            }
  108.            // 23 点需要单独判断,超过23 点30 就应该休息
  109.            if ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {
  110.               return true;
  111.            }
  112.            // 3. 非休息时间
  113.            return false;
  114.        }
  115.        /**
  116.          * 判断是否有人修改了系统时间,如果有人修改了系统时间返回true ,<BR>
  117.          * 否则返回false
  118.          *
  119.          * @return
  120.          */
  121.        private boolean detectModifySytemTime(PrintWriter _out) {
  122.            // 1. 第一次检测系统时间
  123.            if (m_lLastMilliSeconds == 0) {
  124.               m_lLastMilliSeconds = System.currentTimeMillis();
  125.               return false;
  126.            }
  127.            // 2. 检测两次时间的差值
  128.            long lInteral = System.currentTimeMillis() - m_lLastMilliSeconds;
  129.            lInteral = Math.abs(lInteral);
  130.            // 3. 判断两次的时间间隔, 两次结果不一定完全等于 m_nDetectInterval ,允许误差为1 分钟
  131.            long lMaxInterval = m_nDetectInterval + 60 * 1000;
  132.            appendLog(_out, "lInteral :::" + lInteral);
  133.            appendLog(_out, "lMaxInterval :::" + lMaxInterval);
  134.            if (lInteral > lMaxInterval) {
  135.               // 有人修改了系统时间,强制关机
  136.               return true;
  137.            }
  138.            // 4. 只有没人修改时间才记录上次检测时间
  139.            m_lLastMilliSeconds = System.currentTimeMillis();
  140.            return false;
  141.        }
  142.        /**
  143.          * 在指定的流中写入日志信息
  144.          *
  145.          * @param _outWriter
  146.          * @param _sAppendContent
  147.          */
  148.        private void appendLog(PrintWriter _outWriter, String _sAppendContent) {
  149.            if (_outWriter == null) {
  150.               return;
  151.            }
  152.            _outWriter.println(_sAppendContent);
  153.        }
  154.        /**
  155.          * 执行关机命令
  156.          */
  157.        private void exectueShutDown(PrintWriter _out) {
  158.            if (bHasShutDownPC) {
  159.               SimpleDateFormat df = new SimpleDateFormat(
  160.                      "yyyy-MM-dd HH:mm:ss");
  161.               appendLog(_out, " 系统即将关闭, 当前时间:" + df.format(new Date()));
  162.               return;
  163.            }
  164.            appendLog(_out, " 有人修改了系统时间,系统强制关机!");
  165.            // 关机
  166.            try {
  167.               Runtime.getRuntime().exec(
  168.                      "shutdown -s -t 120 -c /" 很晚了,该睡觉了,2 分钟后关闭计算机。/"");
  169.            } catch (IOException e) {
  170.               appendLog(_out, e.getMessage());
  171.            }
  172.            bHasShutDownPC = true;
  173.        }
  174.     }
  175. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP