• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

      2. java實現(xiàn)電腦定時關(guān)機的方法

        時間:2024-06-20 03:46:17 計算機等級 我要投稿
        • 相關(guān)推薦

        java實現(xiàn)電腦定時關(guān)機的方法

          Java能夠自動處理對象的引用和間接引用,實現(xiàn)自動的無用單元收集,使用戶不必為存儲管理問題煩惱,能更多的時間和精力花在研發(fā)上。下面是小編收集的關(guān)于java實現(xiàn)電腦定時關(guān)機的方法,希望大家認真閱讀!

        java實現(xiàn)電腦定時關(guān)機的方法

          一、問題:

          最近想找個軟件來控制電腦的關(guān)機時間,在網(wǎng)上找了幾個,都是可視化界面的可以設(shè)置具體的關(guān)機時間的軟件。由于我想編寫的關(guān)機程序是運行在別人機器上,只能讓該機器在晚上17 點到23 點25 分才上網(wǎng),到了23 點25 分就可以自動關(guān)機。為了讓別人感覺不到這個軟件的“存在”(免得使用者自己關(guān)閉定時關(guān)機軟件),所以我想把關(guān)機軟件注冊為服務(wù)的方式,運行在后臺。這里介紹下如何利用javaService 軟件把java 程序注冊為windows 服務(wù)。

          二、實現(xiàn)方法:

          1. 利用javaService 注冊java 程序為windows 服務(wù)

          ① 下載javaService

          訪問網(wǎng)址http://javaservice.objectweb.org/ 下載windows 版本的javaService 文件,我下載的是JavaService-2.0.10.rar ,目前最新的版本就是“2.0.10 ”。

          ② 安裝javaService

          解壓我們下載下來的javaServices 到一個目錄,我是解壓到目錄“D:/software/JavaService-2.0.10 ”下(解壓到任何目錄都可以,最好別解壓到中文目錄,省的出現(xiàn)問題 )

          ③ 編寫定時關(guān)機代碼

          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 服務(wù)

          進入“D:/software/JavaService-2.0.10 “目錄,執(zhí)行如下命令:

          代碼如下:

          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 “后面的參數(shù)為服務(wù)的名稱,“-start ”參數(shù)后邊是要啟動的類名,“Djava.class.path ”后面參數(shù)中的

          “D:/software/JavaService-2.0.10/classe ”地址是我的“TimerShutDownWindows ”類存放的路徑,實際應(yīng)用中修改為自己的classPath 即可。

          這里需要注意幾點:

          1) “%JAVA_HOME% ”jdk 目錄,如果沒有配置jdk 目錄,則替換為jdk 的實際絕對地址。

          2) -Djava.class.path 是必須的,因為服務(wù)啟動的時候無法訪問系統(tǒng)的CLASSPATH 變量,所以必須在這里聲明;如果jar 比較多,為避免寫的命令過長,我們可以使用“-Djava.ext.dirs=jars 所在目錄”參數(shù)。

          3) 服務(wù)添加之后,可以在命令行中敲入“services.msc ”命令來查看所有服務(wù),并可以對服務(wù)的啟動類型(自動啟動還是手動啟動等)進行修改。

          ⑤ 測試

          1) 啟動服務(wù)

          當我們注冊完服務(wù)后,我們可以通過命令“net start MyShutDownService ”來啟動該服務(wù),服務(wù)啟動后會在D 盤根目錄生成my_shutdown.log 日志文件。

          2) 關(guān)閉服務(wù)

          如果我們要關(guān)閉服務(wù),可以通過命令“net stop MyShutDownService ”來關(guān)閉該服務(wù)。

          3) 刪除服務(wù)

          當我們想刪除該服務(wù)時,可以使用命令“sc delete MyShutDownService ”來刪除該服務(wù)。

          2. 定時關(guān)機代碼

          代碼如下:

          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 {

          /* 檢測是否需要關(guān)機的時間間隔 */

          private static long m_nDetectInterval = 5000;

          /* 記錄上次檢測的時間,以毫秒為單位 */

          private static long m_lLastMilliSeconds = 0;

          /* 可以使用電腦的最小小時 */

          private static int m_nUsePCMinHour = 17;

          /* 可以使用電腦的最大小時 */

          private static int m_nUseComputerMaxHour = 23;

          /* 如果分鐘超過這個時間,則關(guān)機計算機 */

          private static int m_nMinutes = 25;

          /* 記錄日志的文件的保存位置 */

          private static String m_sLogFile = "D:" + File.separator

          + "my_shutdown.log";

          /* 記錄當前系統(tǒng)是否已經(jīng)啟動自動關(guān)閉程序 */

          private static boolean bHasShutDownPC = false;

          /**

          * @param args

          */

          public static void main(String[] args) {

          // 1. 單獨開啟一個線程去檢測

          Thread aThread = new Thread(new TimerDetector());

          aThread.start();

          }

          /**

          * 定義內(nèi)部類

          *

          * @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. 記錄服務(wù)啟動時間

          appendLog(out, " 服務(wù)啟動時間:" + df.format(new Date()));

          while (true) {

          // 1. 判斷當前系統(tǒng)時間是否被修改過

          boolean bShoudShutDownPC = validateShoudShutDownPC(out);

          if (bShoudShutDownPC) {

          // 驗證沒通過,強制關(guān)機

          exectueShutDown(out);

          } else {

          bHasShutDownPC = false;

          }

          // 2. 當前線程休眠下

          try {

          Thread.sleep(m_nDetectInterval);

          } catch (InterruptedException e) {

          appendLog(out, e.getMessage());

          }

          }

          }

          /**

          * 驗證當前時間是否是需要關(guān)機的時間

          *

          * @return

          */

          private boolean validateShoudShutDownPC(PrintWriter _out) {

          // 1. 判斷是否修改了系統(tǒng)時間

          boolean bHasModifySystemTime = detectModifySytemTime(_out);

          appendLog(_out, "bHasModifySystemTime :" + bHasModifySystemTime);

          if (bHasModifySystemTime) {

          return bHasModifySystemTime;

          }

          // 2. 沒有修改系統(tǒng)時間,則判斷當前時間是否超過了指定的時間

          boolean bShoudSleep = nowIsSleepTime();

          appendLog(_out, "bShoudSleep :" + bShoudSleep);

          if (bShoudSleep) {

          return bShoudSleep;

          }

          return false;

          }

          /**

          * 判斷當前時間是否應(yīng)該休息的時間

          *

          * @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 的時間內(nèi), 最大小時為23

          if (nHour < m_nUsePCMinHour) {

          return true;

          }

          // 23 點需要單獨判斷,超過23 點30 就應(yīng)該休息

          if ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {

          return true;

          }

          // 3. 非休息時間

          return false;

          }

          /**

          * 判斷是否有人修改了系統(tǒng)時間,如果有人修改了系統(tǒng)時間返回true ,

          * 否則返回false

          *

          * @return

          */

          private boolean detectModifySytemTime(PrintWriter _out) {

          // 1. 第一次檢測系統(tǒng)時間

          if (m_lLastMilliSeconds == 0) {

          m_lLastMilliSeconds = System.currentTimeMillis();

          return false;

          }

          // 2. 檢測兩次時間的差值

          long lInteral = System.currentTimeMillis() - m_lLastMilliSeconds;

          lInteral = Math.abs(lInteral);

          // 3. 判斷兩次的時間間隔, 兩次結(jié)果不一定完全等于 m_nDetectInterval ,允許誤差為1 分鐘

          long lMaxInterval = m_nDetectInterval + 60 * 1000;

          appendLog(_out, "lInteral :::" + lInteral);

          appendLog(_out, "lMaxInterval :::" + lMaxInterval);

          if (lInteral > lMaxInterval) {

          // 有人修改了系統(tǒng)時間,強制關(guān)機

          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);

          }

          /**

          * 執(zhí)行關(guān)機命令

          */

          private void exectueShutDown(PrintWriter _out) {

          if (bHasShutDownPC) {

          SimpleDateFormat df = new SimpleDateFormat(

          "yyyy-MM-dd HH:mm:ss");

          appendLog(_out, " 系統(tǒng)即將關(guān)閉, 當前時間:" + df.format(new Date()));

          return;

          }

          appendLog(_out, " 有人修改了系統(tǒng)時間,系統(tǒng)強制關(guān)機!");

          // 關(guān)機

          try {

          Runtime.getRuntime().exec(

          "shutdown -s -t 120 -c /" 很晚了,該睡覺了,2 分鐘后關(guān)閉計算機。/"");

          } catch (IOException e) {

          appendLog(_out, e.getMessage());

          }

          bHasShutDownPC = true;

          }

          }

          }

        【java實現(xiàn)電腦定時關(guān)機的方法】相關(guān)文章:

        電腦在哪設(shè)置定時關(guān)機10-18

        win7系統(tǒng)定時關(guān)機設(shè)置方法07-30

        Java動態(tài)代理實現(xiàn)AOP的方法07-22

        java實現(xiàn)web服務(wù)器的方法10-14

        電腦關(guān)機后自動重啟解決方法09-13

        電腦鼠標關(guān)機后發(fā)光問題的解決方法05-11

        win8系統(tǒng)電腦關(guān)機的6種方法10-15

        實現(xiàn)鼠標畫圖的Java程序06-22

        Java多線程的實現(xiàn)方式07-08

        強制關(guān)機對電腦有什么危害09-25

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 亚洲欧美激情精品一区二区 | 亚洲美女视频免费爽 | 亚洲日韩一区二区三区高清 | 日韩欧美国产一二区 | 五月丁香六月婷婷视频播放器 | 色久综合AV在线 |