熟悉编写JavaScript的人,都习惯在页面写入setTimeOut来实现web页面的定时监控或事务处理。但是如何在Java服务端来实现这样一个监控机制呢?一般大家都会想到线程。但是一直以来,都没有亲身动手实践过。趁着工作间隙,自己也搬出一段代码来,与大家一起分享线程编程的神奇魔力。
首先创建一个基本抽象类SchedThread,代码内容如下:
package com.test;
/**
* 基于Java线程实现后台定时监控 <p/> Created: Mar 26, 2008 10:08:43 <p/>
* <h4>http://tailsherry.iteye.com</h4>
* <p/>
*
* @author TailSherry
*/
public abstract class SchedThread
{
protected static final long NEVER = Long.MAX_VALUE;
// 定义一个线程锁,保证当前只有一个工作在操作中
private final Object lock = new Object();
// 定义一个Thread变量
private Thread thread;
// 控制线程循环的开关
private boolean active = true;
// 定义一个毫秒级的时间变量,指示何时执行下一个操作
private long nextTime;
/**
* 定义个一个抽象的方法用来获取下一个执行操作的时间,可使用NEVER
*/
protected abstract long getNextTime();
/**
* 定义一个抽象的方法,让子类来定义具体的工作过程
*/
protected abstract void executeWork();
protected String getName()
{
return getClass().getName();
}
/**
* 启动线程
*/
public void start()
{
thread = new Thread(new Runnable()
{
public void run()
{
runInternal();
}
}, getName());
thread.start();
}
/**
* 强迫停止线程,跳出for循环
*/
public void stop() throws InterruptedException
{
synchronized (lock)
{
active = false;
lock.notify();
}
thread.join();
}
/**
* 此方法可以在任何时候激活当前线程,让线程进入工作执行环节
*/
public void workAdded(long time)
{
synchronized (lock)
{
if (time < nextTime)
{
// 立刻激活线程工作继续运行
lock.notify();
}
}
}
/**
* 线程监测控制逻辑部分
*/
private void runInternal()
{
// 无限循环
for (;;)
{
// 该过程忽略了所有的Exception,以保证线程不会因此而中断
try
{
synchronized (lock)
{
nextTime = getNextTime();
// 获得时间区间,即要等待的时间段
long interval = nextTime - System.currentTimeMillis();
if (interval > 0)
{
try
{
lock.wait(interval);
}
catch (InterruptedException e)
{
// 忽略此Exception
}
}
// 如果active为false,强制中断
if (!active)
{
break;
}
}
// 执行具体的工作
executeWork();
}
catch (Throwable t)
{
try
{
Thread.sleep(10000);
}
catch (InterruptedException ie)
{
// 忽略此Exception
}
}
}
}
}
以上这个类非常关键,基本上已经实现了所有的控制逻辑,如此再扩展出一个实现类出来,比如这里我写了一个模拟实现类MyDataGenerator,大家可以参考一下:
package com.test;
public class MyDataGenerator extends SchedThread {
protected void executeWork() {
System.out.println("Execute work ...");
}
protected long getNextTime() {
return System.currentTimeMillis() + 2000L;
}
public static void main(String argv[]) {
MyDataGenerator generator = new MyDataGenerator();
generator.start();
}
}
当然这里没有使用workAdded和stop等功能,可以留给大家扩展。
分享到:
相关推荐
一、Java线程 在Java中,最常见的方式是通过创建线程来实现后台进程。Java语言提供了Thread类,我们可以自定义Thread子类并重写run()方法,这样当线程启动时,就会执行run()中的代码。例如: ```java class ...
Java定时检测系统是一种基于Java编程语言实现的自动化解决方案,它能够按照预设的时间间隔执行特定的任务,例如数据更新、文件修改、系统监控等。在Java中实现这样的功能,主要依赖于以下几个关键知识点: 1. **...
在实际开发中,多线程后台下载还涉及到其他一些关键点: 1. **线程池管理**:为了避免大量线程的创建和销毁带来的性能开销,可以使用线程池(ThreadPoolExecutor)来管理线程,合理分配系统资源。 2. **断点续传**...
Java和Netty是两个在IT领域中非常重要的技术。...通过深入学习和实践这个项目,开发者不仅可以掌握Netty时间轮的工作原理,还能提升在高并发环境下处理定时任务的能力,这对于构建高效、稳定的后台服务具有很高的价值。
【标题】:“基于JAVA CS远程监控系统软件的实现”是一个典型的Java毕业设计项目,它涉及到的是使用Java技术构建一个客户端-服务器(Client-Server)架构的远程监控系统。这个项目的核心是利用Java语言的特性来实现...
2. **线程管理**:在Java中,定时任务通常需要在后台线程中执行,以避免阻塞主线程。`ScheduledExecutorService`允许我们创建一个线程池来管理这些任务,确保系统的高效运行。 3. **短信服务API**:发送短信需要与...
在Java中,我们可以使用`java.util.Timer`和`java.util.TimerTask`类来实现基础的定时任务,但它们并不支持注解,且线程管理相对复杂。而`quartz`或`Spring Framework`中的`@Scheduled`注解则提供了一种更加优雅的...
在iOS应用开发中,苹果提供了Apple Push Notification service (APNs) 来实现实时的消息推送功能,让应用程序在后台状态下也能接收到服务器的通知。本文将详细介绍如何使用Java编写后端来实现iOS的推送服务。 首先...
【JAVA定时截屏小程序】是一种基于Java编程语言开发的应用程序,设计用于在Windows操作系统环境下实现自动定时抓取屏幕图像的功能。这个小程序可以帮助用户方便地记录屏幕活动,无需手动操作即可获得一系列连续的...
通过以上分析,我们可以推测这个程序的工作流程大致如下:Watch.java线程持续监控某些条件(例如日志文件、程序状态文件),当满足特定条件(比如出现错误日志)时,通知主程序Test.java。Test.java接收到信号后,...
《基于Java SpringBoot框架开发的抽奖游戏后台》 在当今的软件开发领域,Java语言以其稳定性和强大的生态系统占据了重要的地位,特别是在后端开发中。SpringBoot作为Java平台上的一个热门框架,极大地简化了Web应用...
Java定时执行方法与节拍器是程序开发中常见的需求,特别是在服务器端应用或者后台服务中,需要定期执行某些任务,例如数据同步、日志清理、定时推送等。本篇文章将深入探讨Java中如何实现定时执行的方法,并介绍一个...
学习这个示例代码,开发者可以了解如何在安卓中实现后台摄像、定时录像和3gp文件的保存,这对于开发监控类应用或者其他需要长时间录像的场景非常有用。不过,由于源码可能未经完全验证,开发者在实际应用中可能需要...
7. 轮询模式:定时轮询检查某个条件,例如在监控系统中检查服务器状态。 8. 线程局部变量模式:ThreadLocal类提供线程私有的变量,避免多线程环境中的数据共享问题。 9. 死锁避免模式:通过合理设计资源获取顺序和...
后台线程的应用场景通常包括但不限于:系统监控、定时任务、日志记录等,这些任务需要在后台持续进行,但不会阻塞程序的正常退出。 在Java中,我们可以使用以下方式检查线程是否是后台线程: ```java thread....
Java监听键盘鼠标全局事件 Java监听键盘鼠标全局事件是指使用Java语言来监听和处理键盘和鼠标...该技术需要深入了解Java Native Interface、Windows Hook机制、线程和同步等技术细节,以便正确地实现事件监听和处理。
- `java.util.Timer`:这是一个线程类,用于调度定时任务。 - `java.util.TimerTask`:继承自Runnable接口,是定时任务的具体实现类,需要覆盖`run()`方法来定义要执行的任务。 2. **ScheduledExecutorService** ...
当需要在Windows服务中运行Java定时任务时,Apache Commons Daemon和Procrun可以将Java应用程序转换为Windows服务,从而实现后台自动启动和定时运行。 9. **Java 11的LocalScheduledExecutor** Java 11引入了`...
本项目采用`ThreadPoolTaskScheduler`来实现定时任务,这是一种基于Java线程池的定时任务调度器,相比Spring的`@Scheduled`注解,它提供了更灵活的配置和管理方式。 1. **ThreadPoolTaskScheduler介绍** `...
综上所述,"多线程定时并发类数据库操作日之类"的项目可能是一个设计用于高效执行定时数据库操作的系统,使用多线程提升并发性能,并通过日志类监控和记录运行状态。在实际开发中,需要考虑线程安全、性能优化、日志...