JAVA怎么定时启动服务进程(满意答案给高分)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA怎么定时启动服务进程(满意答案给高分)相关的知识,希望对你有一定的参考价值。

我现在有一个功能是数据搬迁的,我要定时启动他,多线程什么的我都写好,其他的一切都写好了.但是现在我要定时,比如我要定时到今天晚上11点钟启动这个服务,这个类的代码如下(下面代码只是起说明作用,可以在下面代码基础上给出提示):
public class StartDataMoveEngine implements ServletContextListener

private Timer timer = null ;

public void contextDestroyed(ServletContextEvent arg0)

timer.cancel() ;

public void contextInitialized(ServletContextEvent arg0)
DataMoveRun dmr = new DataMoveRun();

timer = new Timer();
Calendar calendar=Calendar.getInstance();
Date d1 = new Date() ;

Date date=new Date();

calendar.set(date.getYear(), date.getMonth(),date.getDay(),date.getHours(),date.getMinutes(),date.getSeconds());
timer.schedule(dmr, new Timestamp(calendar.getTimeInMillis()), 24*60*1000*60);//每隔24个小时运行一次
System.out.println("*************************"+new Date().getTime()+"启动数据迁移服务********************");




注明:上面代码是错误的,不能达到我的要求

1、while(true)
if (当前时间到了11点)
做你的Task();

Thread.sleep(30*1000); //sleep 30 seconds


2、写一个.bat文件(里面调用你的Java类),用Windows的计划任务,每天11点执行这个.bat文件。
3、用开源的Quartz框架,专门做定时任务的。可能需要下载,看看文档,写几个配置文件。

推荐第三种,最专业的。
参考技术A 基本思想就是在你程序启动的时候获得当前时间,设为时间a,然后算出时间a到11点之间的时间间隔(毫秒),然后设置timer,task,定时爆发就可以了。

Linux下java进程CPU占用率高分析方法

Linux下java进程CPU占用率高分析方法

在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况。这种情况发生时,我们怎么去找出原因并解决。

一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用

1. 通过top命令找到可疑进程PID

top - 09:37:18 up 70 days, 16:29,  2 users,  load average: 1.13, 1.04, 0.97
Tasks: 105 total,   1 running, 104 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.0%us,  4.9%sy,  0.0%ni, 93.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.5%st
Mem:   2067816k total,  1756680k used,   311136k free,   236340k buffers
Swap:   524284k total,   255508k used,   268776k free,   277040k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
24138 apache    20   0 1273m 384m 3668 S 103.3 19.0   1232:39 java
 3359 root      39  19  2704   36    0 S  0.3  0.0   4:39.34 gam_server
 6696 root      20   0 34148 1604  244 S  0.3  0.1   5:06.63 httpd
19254 root      20   0  785m 221m 3176 S  0.3 11.0   9:04.36 java
    1 root      20   0  2224   28    0 S  0.0  0.0   1:22.46 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      20   0     0    0    0 S  0.0  0.0   0:33.42 ksoftirqd/0
    5 root      20   0     0    0    0 S  0.0  0.0   0:00.03 kworker/u:0

从上面命令中可以看出java进程CPU利用率一直保持100%,稳居不下,找到PID 24138

2. 找出消耗资源最高的线程

top -H -p 24138 可以不用第一步,直接执行命令 top -H ,就可以查看到消耗资源最高的线程

top - 09:49:49 up 70 days, 16:41,  2 users,  load average: 1.01, 1.04, 1.00
Tasks:  72 total,   1 running,  71 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.6%us,  1.3%sy,  0.0%ni, 97.7%id,  0.1%wa,  0.0%hi,  0.0%si,  0.2%st
Mem:   2067816k total,  1760840k used,   306976k free,   236744k buffers
Swap:   524284k total,   253344k used,   270940k free,   279092k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
24167 apache    20   0 1273m 384m 3688 R 99.1 19.0   1169:43 java
24152 apache    20   0 1273m 384m 3688 S  2.0 19.0   0:28.58 java
24188 apache    20   0 1273m 384m 3688 S  2.0 19.0   4:56.69 java
24138 apache    20   0 1273m 384m 3688 S  0.0 19.0   0:00.00 java

3. 查看这个线程所有系统调用 

strace -p  29679

4. 将需要的线程ID转换为16进制格式

printf "%x\n" 29679 
73ef

5. 最后打印线程的堆栈信息:

jstack 29679|grep 73ef -A 30 

通过这几步基本可以找出什么原因导致java进程占用那么高CPU资源。

以上是关于JAVA怎么定时启动服务进程(满意答案给高分)的主要内容,如果未能解决你的问题,请参考以下文章

安装Oracle后Java.exe进程怎么关掉?

WIN7 怎么设置SK5

高分求教!

crond服务总结

workerman 怎么启动定时器

Delphi的几个难题?