`
tailsherry
  • 浏览: 136422 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

基于Java线程实现后台定时监控

阅读更多

熟悉编写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等功能,可以留给大家扩展。

 

分享到:
评论
1 楼 wangshengli 2008-09-20  
好文,谢谢

相关推荐

    java实现后台进程

    一、Java线程 在Java中,最常见的方式是通过创建线程来实现后台进程。Java语言提供了Thread类,我们可以自定义Thread子类并重写run()方法,这样当线程启动时,就会执行run()中的代码。例如: ```java class ...

    java定时检测系统

    Java定时检测系统是一种基于Java编程语言实现的自动化解决方案,它能够按照预设的时间间隔执行特定的任务,例如数据更新、文件修改、系统监控等。在Java中实现这样的功能,主要依赖于以下几个关键知识点: 1. **...

    多线程--下载---后台运行

    在实际开发中,多线程后台下载还涉及到其他一些关键点: 1. **线程池管理**:为了避免大量线程的创建和销毁带来的性能开销,可以使用线程池(ThreadPoolExecutor)来管理线程,合理分配系统资源。 2. **断点续传**...

    基于Java+netty内置时间轮工具处理大批量定时或超时任务工具源码.zip

    Java和Netty是两个在IT领域中非常重要的技术。...通过深入学习和实践这个项目,开发者不仅可以掌握Netty时间轮的工作原理,还能提升在高并发环境下处理定时任务的能力,这对于构建高效、稳定的后台服务具有很高的价值。

    java毕业设计-基于JAVA CS远程监控系统软件的实现(源代码+论文).zip

    【标题】:“基于JAVA CS远程监控系统软件的实现”是一个典型的Java毕业设计项目,它涉及到的是使用Java技术构建一个客户端-服务器(Client-Server)架构的远程监控系统。这个项目的核心是利用Java语言的特性来实现...

    java 软件开发短信定时发送

    2. **线程管理**:在Java中,定时任务通常需要在后台线程中执行,以避免阻塞主线程。`ScheduledExecutorService`允许我们创建一个线程池来管理这些任务,确保系统的高效运行。 3. **短信服务API**:发送短信需要与...

    使用多线程开启定时任务(注解版)

    在Java中,我们可以使用`java.util.Timer`和`java.util.TimerTask`类来实现基础的定时任务,但它们并不支持注解,且线程管理相对复杂。而`quartz`或`Spring Framework`中的`@Scheduled`注解则提供了一种更加优雅的...

    ios推送java写的后台

    在iOS应用开发中,苹果提供了Apple Push Notification service (APNs) 来实现实时的消息推送功能,让应用程序在后台状态下也能接收到服务器的通知。本文将详细介绍如何使用Java编写后端来实现iOS的推送服务。 首先...

    JAVA定时截屏小程序

    【JAVA定时截屏小程序】是一种基于Java编程语言开发的应用程序,设计用于在Windows操作系统环境下实现自动定时抓取屏幕图像的功能。这个小程序可以帮助用户方便地记录屏幕活动,无需手动操作即可获得一系列连续的...

    java程序自动重新启动

    通过以上分析,我们可以推测这个程序的工作流程大致如下:Watch.java线程持续监控某些条件(例如日志文件、程序状态文件),当满足特定条件(比如出现错误日志)时,通知主程序Test.java。Test.java接收到信号后,...

    基于Java SpringBoot框架开发的抽奖游戏后台.zip

    《基于Java SpringBoot框架开发的抽奖游戏后台》 在当今的软件开发领域,Java语言以其稳定性和强大的生态系统占据了重要的地位,特别是在后端开发中。SpringBoot作为Java平台上的一个热门框架,极大地简化了Web应用...

    java定时执行方法&节拍器

    Java定时执行方法与节拍器是程序开发中常见的需求,特别是在服务器端应用或者后台服务中,需要定期执行某些任务,例如数据同步、日志清理、定时推送等。本篇文章将深入探讨Java中如何实现定时执行的方法,并介绍一个...

    安卓拍照上传录像监控录屏相关-包含后台线程自动摄像定时器到时间自动保存3gp文件。正常摄像.rar

    学习这个示例代码,开发者可以了解如何在安卓中实现后台摄像、定时录像和3gp文件的保存,这对于开发监控类应用或者其他需要长时间录像的场景非常有用。不过,由于源码可能未经完全验证,开发者在实际应用中可能需要...

    JAVA多线程设计模式详解

    7. 轮询模式:定时轮询检查某个条件,例如在监控系统中检查服务器状态。 8. 线程局部变量模式:ThreadLocal类提供线程私有的变量,避免多线程环境中的数据共享问题。 9. 死锁避免模式:通过合理设计资源获取顺序和...

    Java中后台线程实例解析

    后台线程的应用场景通常包括但不限于:系统监控、定时任务、日志记录等,这些任务需要在后台持续进行,但不会阻塞程序的正常退出。 在Java中,我们可以使用以下方式检查线程是否是后台线程: ```java thread....

    Java监听键盘鼠标全局事件[定义].pdf

    Java监听键盘鼠标全局事件 Java监听键盘鼠标全局事件是指使用Java语言来监听和处理键盘和鼠标...该技术需要深入了解Java Native Interface、Windows Hook机制、线程和同步等技术细节,以便正确地实现事件监听和处理。

    java定时任务

    - `java.util.Timer`:这是一个线程类,用于调度定时任务。 - `java.util.TimerTask`:继承自Runnable接口,是定时任务的具体实现类,需要覆盖`run()`方法来定义要执行的任务。 2. **ScheduledExecutorService** ...

    Java语言定时调度任务之实现.zip

    当需要在Windows服务中运行Java定时任务时,Apache Commons Daemon和Procrun可以将Java应用程序转换为Windows服务,从而实现后台自动启动和定时运行。 9. **Java 11的LocalScheduledExecutor** Java 11引入了`...

    Springboot 通过ThreadPoolTaskScheduler实现定时任务.rar

    本项目采用`ThreadPoolTaskScheduler`来实现定时任务,这是一种基于Java线程池的定时任务调度器,相比Spring的`@Scheduled`注解,它提供了更灵活的配置和管理方式。 1. **ThreadPoolTaskScheduler介绍** `...

    多线程定时并发类数据库操作日之类

    综上所述,"多线程定时并发类数据库操作日之类"的项目可能是一个设计用于高效执行定时数据库操作的系统,使用多线程提升并发性能,并通过日志类监控和记录运行状态。在实际开发中,需要考虑线程安全、性能优化、日志...

Global site tag (gtag.js) - Google Analytics