重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
我是让它每10毫秒扫描一下。
站在用户的角度思考问题,与客户深入沟通,找到张家界网站设计与张家界网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、网站建设、企业官网、英文网站、手机端网站、网站推广、域名申请、虚拟主机、企业邮箱。业务覆盖张家界地区。
Calendar ca=null;
Calendar ca1=null;
Timer timer=new Timer();
static Connection con=null;
public void chu(){
ca=Calendar.getInstance();
ca1=(Calendar)ca.clone();
ca1.add(Calendar.SECOND, 20);
}
public void Time(){
float s=ca1.get(Calendar.SECOND)-ca.get(Calendar.SECOND)+(ca1.get(Calendar.MILLISECOND)-ca.get(Calendar.MILLISECOND))/1000f;
if(con==null){
System.out.println("耗时"+String.valueOf(s)+"秒");
if(ca.after(ca1)){
System.out.println("取不到连接");
timer.cancel();
return ;
}
}else{
System.out.println("耗时"+String.valueOf(s)+"秒");
}
ca.add(Calendar.MILLISECOND, 10);
timer.schedule(
new TimerTask() {
public void run() {
System.out.println("时间在溜走。。。。");
Time();
}
}, ca.getTime());
}
void getcon(){
Connection con=null;//获取Connection
chu();
Time();
}
好多朋友用过Windows的任务计划 也有不少程序迷自己曾写过时钟报警 系统自动关机等趣味程序 可却很少有朋友在Web工程中实现过类似功能
当Web工程启动时 定时器能自动开始计时 在整个Web工程的生命期里 定时器能在每晚深夜触发一次任务 因此定时器的存放位置也值得考查 不能简单的存在于单个Servlet或JavaBean中 必须能让定时器宿主的存活期为整个Web工程生命期 在工程启动时能自动加载运行 结合这两点 跟 Servlet上下文有关的侦听器就最合适不过了 通过在工程的配置文件中加以合理配置 会在工程启动时自动运行 并在整个工程生命期中处于监听状态
下面就Servlet侦听器结合Java定时器来讲述整个实现过程 要运用Servlet侦听器需要实现 javax servlet ServletContextListener接口 同时实现它的contextInitialized (ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数 考虑定时器有个建立和销毁的过程 看了前面两个接口函数 就不容置疑的把建立的过程置入 contextInitialized 把销毁的过程置入contextDestroyed了
我把ServletContextListener的实现类取名为ContextListener 在其内添加一个定时器 示例代码如下所示
import java util Timer;
import javax servlet ServletContextEvent;
import javax servlet ServletContextListener;
import javax servlet ServletException;
import javax servlet ServletRequest;
import javax servlet ServletResponse;
import javax servlet HttpServlet;
public class ContextListener
extends HttpServlet
implements ServletContextListener {
public ContextListener() {
}
private java util Timer timer = null;
public void contextInitialized(ServletContextEvent event) {
timer = new java util Timer(true);
event getServletContext() log( 定时器已启动 );
timer schedule(new MyTask(event getServletContext()) * * );
event getServletContext() log( 已经添加任务调度表 );
}
public void contextDestroyed(ServletContextEvent event) {
timer cancel();
event getServletContext() log( 定时器销毁 );
}
}
以上代码中 timer schedule(new MyTask(event getServletContext()) * * )这一行为定时器调度语句 其中MyTask是自定义需要被调度的执行任务(在我的财政数据中心项目中就是报表计算引擎入口) 从 java util TimerTask继承 下面会重点讲述 第三个参数表示每小时(即 * * 毫秒)被触发一次 中间参数 表示无延迟 其它代码相当简单 不再详细说明
下面介绍MyTask的实现 上面的代码中看到了在构造MyTask时 传入了javax servlet ServletContext类型参数 是为记录Servlet日志方便而传入 因此需要重载MyTask的构造函数(其父类java util TimerTask原构造函数是没有参数的) 在timer schedule()的调度中 设置了每小时调度一次 因此如果想实现调度任务每 小时被执行一次 还需要判断一下时钟点 以常量C_SCHEDULE_HOUR表示(晚上 点 也即 点) 同时为防止 小时执行下来 任务还未执行完(当然 一般任务是没有这么长的) 避免第二次又被调度以引起执行冲突 设置了当前是否正在执行的状态标志isRunning 示例代码如下所示
import java util *;
import javax servlet ServletContextEvent;
import javax servlet ServletContextListener;
import javax servlet ServletException;
import javax servlet ServletRequest;
import javax servlet ServletResponse;
import javax servlet HttpServlet;
import javax servlet *;
public class MyTask extends TimerTask {
private static final int C_SCHEDULE_HOUR = ;
private static boolean isRunning = false;
private ServletContext context = null;
public MyTask() {
}
public MyTask(ServletContext context) {
ntext = context;
}
public void run() {
Calendar cal = Calendar getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR == cal get(Calendar HOUR_OF_DAY)) {
isRunning = true;
context log( 开始执行指定任务 );
//TODO 添加自定义的详细任务 以下只是示例
//系统定时接收邮件
Email email=new Email();
email recieve();
isRunning = false;
context log( 指定任务执行结束 );
}
}
else {
context log( 上一次任务执行还未结束 );
}
}
}
到这儿 ServletContextListener和MyTask的代码都已完整了 最后一步就是把ServletContextListener部署到您的Web工程中去 在您工程的web xml配置文件中加入如下三行
listener
listener class test ContextListener/listener class
/listener
lishixinzhi/Article/program/Java/hx/201311/26421
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class MainEntry {
private int a;
public void setVal(){
Timer timer = new Timer();
//每隔一秒生成一个[1,100)内的随机整数,赋给成员a
timer.schedule(new TimerTask() {
@Override
public void run() {
Random rand = new Random();
setA(rand.nextInt(100));
}
}, 1000);
}
public void setA(int a) {
this.a = a;
}
public int getA() {
return a;
}
public static void main(String[] args) {
MainEntry me = new MainEntry();
me.setVal();
}
}
指定定时任务的代码如下:
public void schedule(TimerTask task,Date time)
比如,我们希望定时任务2006年7月2日0时0分执行,只要给第二个参数传一个时间设置为2006年7月2日0时0分的Date对象就可以了.
有一种情况是,可能我们的程序启动的时候,已经是2006年7月3日了,这样的话,程序一启动,定时任务就开始执行了.
schedule最后一个重载的方法是
public void schedule(TimerTask task,Date firstTime,long period)
既然号称是定时任务,我们肯定希望由我们来指定任务指定的时间,显然上面的方法就不中用了,因为我们不知道程序什么时间开始运行,就没办法确定需要延时多少.没关系,schedule四个重载的方法还没用完呢.用下面这个就OK了。
应该用线程里面的Timer来控制package com.sy.game.test;
import java.util.Timer;
import java.util.TimerTask;
public class TimeTask {
public static void main(String[] args) {
TimeTask tTask=new TimeTask();
tTask.timeVoid();
}
public void timeVoid(){
final Timer timer = new Timer();
TimerTask tt=new TimerTask() {
@Override
public void run() {
System.out.println("到点啦!");
timer.cancel();
}
};
timer.schedule(tt, 3000);
}
}
整合的:
/*
* java倒计时器
* shiyang
* */
package com.sy.game.test;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
@SuppressWarnings("unused")
public class TimeController extends JFrame implements ActionListener {
private static final long serialVersionUID = 4603262282860990473L;
private static final int DEFAULT_WIDTH = 200;
private static final int DEFAULT_HEIGHT = 100;
private static final int width = Toolkit.getDefaultToolkit()
.getScreenSize().width;
private static final int height = Toolkit.getDefaultToolkit()
.getScreenSize().height;
private Container container;
private JButton btn;
private JTextField jtfTime;
private Timer tmr;
public TimeController() {
initComponents();
Timer tmr = new Timer(1000, this);
this.tmr = tmr;
setVisible(true);
}
private void initComponents() {
this.setTitle("SY秒表");
this.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
this.setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocation((width - DEFAULT_WIDTH) / 2,
(height - DEFAULT_HEIGHT) / 2);
jtfTime = new JTextField("10");
btn = new JButton("开始倒计时");
container = getContentPane();
JPanel panel = new JPanel();
panel.add(btn);
panel.add(jtfTime);
this.add(panel);
btn.addActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == btn) {
jtfTime.setText("10");
tmr.start();
} else {
int t;
t = Integer.parseInt(jtfTime.getText());
t--;
jtfTime.setText("" + t);
if (t = 0) {
tmr.stop();
}
}
}
public static void main(String[] args) {
TimeController timeController = new TimeController();
}
}