这个任务名称写的有点儿长,简单来说就是类似于linux系统下的守护进程。在windows系统中,被称为服务进程,可以在服务列表中查看、开启、关闭。
JAVA中其实进程的概念并不强烈,更多的接触到的是线程。而实现这个守护进程,其实用到的也是线程。还有一个工具JavaService。
步骤如下:
1、建立两个类:一个负责控制线程的启停,一个就是运行的线程(代码简单,直接用txt写,javac一下就行)
import java.util.*;
public class MyService
{
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();
try
{
// 将服务线程设定为用户线程,以避免StartService方法结束后线程退出
thread.setDaemon(false);
if (thread.isDaemon())
{
System.out.println("成功设定线程为用户线程!");
}
thread.start();
service.run();//这句一定要有啊。我查资料的时候就因为没这句,怎么都不能执行o(╯□╰)o所以要避免“盲目崇拜”
}
catch (Exception e)
{
System.out.println("设定失败!");
}
}
}
class Service implements Runnable
{
private boolean runFlag = true;
/**
* 设定服务线程运行标志值
*/
public synchronized void setRunFlag(boolean runFlag)
{
this.runFlag = runFlag;
}
/**
* 取得服务线程运行标志值
*/
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*300);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
System.out.println("服务线程结束运行。。。");
}
}
2、把JavaService的解压路径加入到path
这步也可以直接把JavaService复制到MyService.class那个目录里
3、然后就打开cmd命令,跳转至当前目录,执行如下语句
JavaService.exe -install TJS "%JAVA_HOME%/jre/bin/server/jvm.dll" -Xmx128m -Djava.class.path=%CLASSPATH%;D:\javaTest -start MyService -method startService -stop MyService -method stopService -out "%CD%/out.log" -err "%CD%/err.log" -current "%CD%"
标红那里相当重要!因为必须在-Djava.class.path后加上你的类所在目录才行。不然就会在启动时出现启动失败,找不到类这样的错误。网上有资料说在最后加个-auto,我是执行失败,而且没有auto也能开机自启。求解释~
TJS是TestJavaService,也就是这个服务进程显示的进程名称
现在创建好了,启动方式有两种:
a、在命令行输入net start TJS
b、重启电脑(建议试试,这样可以比较直观的看到确实是开机自动运行的)
然后在out.log里就可以看到输出的结果了
在服务列表中也可以看到
不想要了也可以销毁:JavaService -uninstall TJS
所以要保证你的进程名称是唯一滴
关于每个命令的详细含义,运行机制神马的我就不过多的赘述了,网上都有。
笔记还是要有个笔记的样子才好