最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年11月20日 15:25:38   投稿:shichen2014  
這篇文章主要介紹了java實現(xiàn)電腦定時關(guān)機的方法,首先通過java注冊windows服務(wù)程序,再以一個簡單的java程序?qū)崿F(xiàn)定時關(guān)機的功能,非常具有實用價值,需要的朋友可以參考下

本文實例講述了java如何注冊成windows服務(wù)程序及一個簡單的java定時關(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 文件導(dǎo)出為class 的形式,把導(dǎo)出的類放到目錄“D:/software/JavaService-2.0.10/classes/com/test/timer ”下。也就是把導(dǎo)出的com 包放到
“D:/software/JavaService-2.0.10/classes” 目錄下。

④ 注冊java 程序為windows 服務(wù)
進入“D:/software/JavaService-2.0.10 “目錄,執(zhí)行如下命令:

復(fù)制代碼 代碼如下:
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ù)

當(dāng)我們注冊完服務(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ù)

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

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

復(fù)制代碼 代碼如下:
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";
    /* 記錄當(dāng)前系統(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. 判斷當(dāng)前系統(tǒng)時間是否被修改過
              boolean bShoudShutDownPC = validateShoudShutDownPC(out);
              if (bShoudShutDownPC) {
                  // 驗證沒通過,強制關(guān)機
                  exectueShutDown(out);
              } else {
                  bHasShutDownPC = false;
              }
              // 2. 當(dāng)前線程休眠下
              try {
                  Thread.sleep(m_nDetectInterval);
              } catch (InterruptedException e) {
                  appendLog(out, e.getMessage());
              }
           }
       }
       /**
         * 驗證當(dāng)前時間是否是需要關(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)時間,則判斷當(dāng)前時間是否超過了指定的時間
           boolean bShoudSleep = nowIsSleepTime();
           appendLog(_out, "bShoudSleep :" + bShoudSleep);
           if (bShoudSleep) {
              return bShoudSleep;
           }
           return false;
       }
       /**
         * 判斷當(dāng)前時間是否應(yīng)該休息的時間
         *
         * @return
         */
       private boolean nowIsSleepTime() {
           // 1. 獲取當(dāng)前小時和分鐘
           Calendar aCalendar = Calendar.getInstance();
           int nHour = aCalendar.get(Calendar.HOUR_OF_DAY);
           int nMinute = aCalendar.get(Calendar.MINUTE);
           // 2. 判斷當(dāng)前小時是否在可以使用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 ,<BR>
         * 否則返回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)閉, 當(dāng)前時間:" + 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程序設(shè)計有所幫助。

相關(guān)文章

  • Java 8中HashMap的底層原理解析

    Java 8中HashMap的底層原理解析

    HashMap作為Java中常用的數(shù)據(jù)結(jié)構(gòu)之一,在JDK 1.8中經(jīng)過了一系列的優(yōu)化和改進,深入理解其底層原理,包括哈希算法、數(shù)組與鏈表結(jié)構(gòu)、紅黑樹的引入等,有助于更好地使用和理解HashMap的性能特性,這篇文章主要介紹了Java 8中HashMap的底層原理,需要的朋友可以參考下
    2023-11-11
  • Mybatis的collection三層嵌套查詢方式(驗證通過)

    Mybatis的collection三層嵌套查詢方式(驗證通過)

    這篇文章主要介紹了Mybatis的collection三層嵌套查詢方式(驗證通過),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 使用Java WebSocket獲取客戶端IP地址的示例代碼

    使用Java WebSocket獲取客戶端IP地址的示例代碼

    在開發(fā)Web應(yīng)用程序時,我們通常需要獲取客戶端的 IP 地址用于日志記錄、身份驗證、限制訪問等操作,本文將介紹如何使用Java WebSocket API獲取客戶端IP地址,以及如何在常見的WebSocket框架中獲得客戶端 IP地址,需要的朋友可以參考下
    2023-11-11
  • Java?循環(huán)隊列/環(huán)形隊列的實現(xiàn)流程

    Java?循環(huán)隊列/環(huán)形隊列的實現(xiàn)流程

    循環(huán)隊列又叫環(huán)形隊列,是一種特殊的隊列。循環(huán)隊列解決了隊列出隊時需要將所有數(shù)據(jù)前移一位的問題。本文將帶大家詳細了解循環(huán)隊列如何實現(xiàn),需要的朋友可以參考一下
    2022-02-02
  • springcloud Zuul動態(tài)路由的實現(xiàn)

    springcloud Zuul動態(tài)路由的實現(xiàn)

    這篇文章主要介紹了springcloud Zuul動態(tài)路由的實現(xiàn),詳細的介紹了什么是Zuu及其動態(tài)路由的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • Java二進制操作(動力節(jié)點Java學(xué)院整理)

    Java二進制操作(動力節(jié)點Java學(xué)院整理)

    這篇文章給大家介紹了java二進制操作技巧,包括移位、位運算操作符等相關(guān)知識點,非常不錯,感興趣的朋友參考下吧
    2017-03-03
  • SpringRetry重試框架的具體使用

    SpringRetry重試框架的具體使用

    在項目開發(fā)中,經(jīng)常會遇到需要重試的地方。本文主要介紹了SpringRetry重試框架的具體使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • QueryWrapper中or的使用技巧分享

    QueryWrapper中or的使用技巧分享

    在日常的開發(fā)工作中,處理數(shù)據(jù)庫查詢是一個非常常見的任務(wù),尤其是當(dāng)我們需要在復(fù)雜條件下篩選數(shù)據(jù)時,如何編寫高效、簡潔且可維護的查詢邏輯顯得尤為重要,本文給大家介紹了QueryWrapper中or的使用技巧,需要的朋友可以參考下
    2024-10-10
  • Reactor 多任務(wù)并發(fā)執(zhí)行且結(jié)果按順序返回第一個

    Reactor 多任務(wù)并發(fā)執(zhí)行且結(jié)果按順序返回第一個

    這篇文章主要介紹了Reactor 多任務(wù)并發(fā)執(zhí)行且結(jié)果按順序返回第一個,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-09-09
  • 使用Spring從YAML文件讀取內(nèi)容映射為Map方式

    使用Spring從YAML文件讀取內(nèi)容映射為Map方式

    這篇文章主要介紹了使用Spring從YAML文件讀取內(nèi)容映射為Map方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論

嘉义县| 和顺县| 莒南县| 南城县| 通化市| 峡江县| 赞皇县| 扶绥县| 山西省| 石门县| 通化县| 庄浪县| 海原县| 来凤县| 历史| 靖江市| 古浪县| 双城市| 信宜市| 唐海县| 乐业县| 富裕县| 平湖市| 长汀县| 常州市| 宣武区| 拉萨市| 东阿县| 乳源| 南京市| 葫芦岛市| 岗巴县| 金塔县| 柳河县| 玛沁县| 内丘县| 祁东县| 广安市| 理塘县| 阳曲县| 靖边县|