日期:2014-05-17 浏览次数:21021 次
Windows系统服务(NT服务)相对于普通应用程序最直接的一个优点是系统启动后就可直接运行而无需用户登录系统。事实上,作为服务器来使用的系统,通常也并不需要登录系统,这样不只是方便,也提升了系统的安全性。不过,通常情况下,Windows系统服务使用C或C++实现,而有些时候基于某些因素的考虑,我们期望使用Java来实现系统服务,可以借助开源的JavaService达到此目的。
以下演示其实现过程。
首先编写实现NT服务的Java类,以下的示例代码通过两个类来达到实现NT服务的目的。类TestService提供了NT服务启动及停止的控制方法,而类Service则实现了NT服务真正要完成的工作。类TestService及类Service的完整代码如下:
view plaincopy to clipboardprint?
package com.yanzhijun;?? 
? 
import java.util.Calendar;?? 
? 
public class TestService?? 
{?? 
??? private static Thread thread=null;?? 
??? private static Service service = null;?? 
? 
??? /**? 
??? * 退出服务方法(该方法必须有参数 String [] args)? 
??? * @param args? 
??? */? 
??? public static void StopService(String[] args)?? 
??? {?? 
??????? System.out.println("停止服务");?? 
??????? service.setRunFlag(false);?? 
??? }?? 
??? /**? 
??? * 启动服务方法(该方法必须有参数 String [] args)? 
??? * @param args? 
??? */? 
??? public static void StartService(String[] args)?? 
??? {?? 
??????? System.out.println("启动服务");?? 
??????? // 产生服务线程?? 
??????? service = new Service();?? 
??????? thread=new Thread(service);?? 
??????? try? 
??????? {?? 
??????????? // 将服务线程设定为用户线程,以避免StartService方法结束后线程退出?? 
??????????? thread.setDaemon(false);?? 
??????????? if(!thread.isDaemon())?? 
??????????? {?? 
??????????????? System.out.println("成功设定线程为用户线程!");?? 
??????????? }?? 
? 
??????????? //启动服务线程?? 
??????????? thread.start();?? 
??????? }?? 
??????? catch(SecurityException se)?? 
??????? {?? 
??????????? System.out.println("线程类型设定失败!");?? 
??????? }?? 
??? }?? 
}?? 
class Service implements Runnable?? 
{?? 
??? private boolean runFlag = true;?? 
? 
??? /**? 
??? * 设定服务线程运行标志值? 
??? * @param runFlag? 
??? */? 
??? public synchronized void setRunFlag(boolean runFlag)?? 
??? {?? 
??????? this.runFlag = runFlag;?? 
??? }?? 
? 
??? /**? 
??? * 取得服务线程运行标志值? 
??? * @param void? 
??? */? 
??? private synchronized boolean getRunFlag()?? 
??? {?? 
??????? return runFlag;?? 
??? }?? 
? 
??? @Override? 
??? public void run()??? 
??? {?? 
??????? System.out.println("服务线程开始运行");?? 
??????? while(getRunFlag())?? 
??????? {?? 
??????????? Calendar cal = Calendar.getInstance();?? 
??????????? long mis = cal.getTimeInMillis();?? 
??????????? System.out.println("当前时间:" + mis);?? 
??????????? try??? 
??????????? {?? 
??????????????? Thread.sleep(1000*10);?? 
??????????? }??? 
??????????? catch (InterruptedException e)??? 
??????????? {?? 
??????????????? e.printStackTrace();?? 
??????????? }?? 
??????? }?? 
??????? System.out.println("服务线程结束运行");?? 
??? }?? 
}? 
package com.yanzhijun;
import java.util.Calendar;
public class TestService
{
?private static Thread thread=null;
?private static Service service = null;
?/**
?* 退出服务方法(该方法必须有参数 String [] args)
?* @param args
?*/
?public static void StopService(String[] args)
?{
??System.out.println("停止服务");
??service.setRunFlag(false);
?}
?/**
?* 启动服务方法(该方法必须有参数 String [] args)
?* @param args
?*/
?public static void StartService(String[] args)
?{
??System.out.println("启动服务");
??// 产生服务线程
??service = new Service();
??thread=new Thread(service);
??try
??{
???// 将服务线程设定为用户线程,以避免StartService方法结束后线程退出
???thread.setDaemon(false);
???if(!thread.isDaemon())
???{
????System.out.println("成功设定线程为用户线程!");
???}
???//启动服务线程
???thread.start();
??}
??catch(SecurityException se)
??{
???System.out.println("线程类型设定失败!");
??}
?}
}
class Service implements Runnable
{
?private boolean runFlag = true;
?/**
?* 设定服务线程运行标志值
?* @param runFlag
?*/
?public synchronized void setRunFlag(boolean runFlag)
?{
??this.runFlag = runFlag;
?}<