Java多线程 定时器

Java多线程中的定时器(java.util.Timer)有定时执行任务的功能,通过设定定时器的间隔时间,会自动在此间隔后执行预先安排好的任务(java.util.TimerTask)。
timer.schedule(TimerTask,delay,interval time)
第一个参数是需要执行的任务。此类的类型为java.util.TimerTask。第二个参数是执行任务前等待时间,第三个参数是间隔时间(单位为毫秒)

package timer;

import java.util.concurrent.PriorityBlockingQueue;

public class MyTimer {
PriorityBlockingQueue<MyTimerTask> queue = new PriorityBlockingQueue<>();
Worker worker;

private static class Worker extends Thread {
    PriorityBlockingQueue<MyTimerTask> queue;

    Worker(PriorityBlockingQueue<MyTimerTask> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while (true) {
            try {
                MyTimerTask task = queue.take();
                long current = System.currentTimeMillis();
                if (task.delay <= current) {
                    task.target.run();
                } else {
                    queue.put(task);
                    Thread.sleep(task.delay - current);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

MyTimer() {
    worker = new Worker(queue);
    worker.start();
}

void execute(Runnable target, long delay) {
    queue.put(new MyTimerTask(target, delay));
}

public static void main(String[] args) {
    MyTimer timer = new MyTimer();
    timer.execute(new Runnable() {
        @Override
        public void run() {
            System.out.println("该起床了");
        }
    }, 2000);
    System.out.println("另一个人");
}

}
package timer;

public class MyTimerTask implements Comparable<MyTimerTask> {
Runnable target;
long delay;

MyTimerTask(Runnable target, long delay) {
    this.target = target;
    this.delay = System.currentTimeMillis() + delay;//延时后的时刻

}

@Override
public int compareTo(MyTimerTask o) {
    if (delay == o.delay) {
//延时后的时刻
        return 0;
    } else if (delay < o.delay) {
        return -1;
    } else {
        return 1;
    }
}

}

原文地址:https://blog.51cto.com/14232658/2470169

时间: 2024-10-15 11:30:44

Java多线程 定时器的相关文章

Java多线程基础(二)定时器类:Timer类和TimerTask类

Java多线程基础(二)定时器类:Timer类和TimerTask类 Timer类和TimerTask类是jdk实现定时器功能的早期方法,jdk1.5以前就支持Timer类和TimerTask类.JDK1.5之后引入了新的机制,将在后续博文中研究. 1 指定时间间隔后执行任务 import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TraditionalTimerTest {

java多线程基本概念与简单实用

概述 程序:Program,是一个静态的概念 进程:Process,是一个动态的概念 进程是程序的一次动态执行过程, 占用特定的地址空间.每个进程都是独立的,由3部分组成cpu,data,code 缺点:内存的浪费,cpu的负担 线程:Thread,是进程中一个"单一的连续控制流程"  (a single sequential flow ofcontrol)/执行路径.线程又被称为轻量级进程(lightweight process). 一个进程可拥有多个并行的(concurrent)线

JAVA多线程读写文件范例

在写之前先声明,本文是基于之前在博客园网站上检索到的一份JAVA多线程读写文件的示例,我在写自己的程序时是在那位作者写的基础上做了改良,但已不记得原文的地址.如果有知情者,烦请帖出地址,我在此文上加入引用或转载. 本程序是基于这么一种考虑,某系统后台有个将近2G大小的日志文件,你用任何编辑器去打开它,都将会很困难.针对这样的大文件解析处理,解决方案是使用多个线程,分割读取指定的大文件.获取我们所需要的信息.不多说,上代码了,有注释可以帮助理解. Java代码   package com.thre

Java多线程编程要点

Java多线程编程要点 认识Thread和Runnable Java中 实现多线程有两种途径:继承Thread类或者实现Runnable接口.Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承, 况且Runnable只有一个run方法,很适合继承.在使用Thread的时候只需继承Thread,并且new一个实例出来,调用 start()方法即可以启动一个线程. Thread Test = new Thread(); Test.start(); 在使用Runnable的时候需

java多线程核心技术梳理(附源码)

java多线程核心技术梳理(附源码) java多线程核心技术梳理附源码 写在前面 java多线程 对象及变量的并发访问 线程间通信 Lock的使用 定时器 单例模式与多线程 拾遗补增 参考资料 本文对多线程基础知识进行梳理,主要包括多线程的基本使用,对象及变量的并发访问,线程间通信,lock的使用,定时器,单例模式,以及线程状态与线程组. 写在前面 花了一周时间阅读<java多线程编程核心技术>(高洪岩 著),本文算是此书的整理归纳,书中几乎所有示例,我都亲手敲了一遍,并上传到了我的githu

《Java 多线程编程核心技术》- 笔记

作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大量的请求进来,按理说,我们应该考虑并发问题.但其实,spring接到请求,分配到controller之后,就已经是线程安全的了,所以我们要做的就是,从controller开始,到最后请求响应结束,保证线程安全即可. 多线程好像有很多东西需要注意,阅读<Java 多线程编程核心技术>后,做个总结,总

java多线程编程从入门到卓越(超详细总结)

导读:java多线程编程不太熟?或是听说过?或是想复习一下?找不到好的文章?别担心我给你们又安利一波,文章内容很全,并且考虑到很多开发中遇到的问题和解决方案.循环渐进,通俗易懂,文章较长,建议收藏再看! 往期精彩放送:一文搞定Java的输入输出流等常见流 一文搞定Java集合类,你还在为Java集合类而烦恼吗? 文章目录 1.多线程的概念 2.多线程并发 3.多线程程序设计 继承Thread类创建线程 新建类实现Runnable接口创建线程 改进(匿名内部类方式) 获取线程的名字和当前线程对象

Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3534050.html Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可

从JAVA多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容: 1.在应用开发中什么时候选择多线程? 2.多线程应该注意些什么? 3.状态转换控制,如何解决死锁? 4.如何设计一个具有可扩展性的多线程处理器? 5.多线程联想:在多主机下的扩展-集群? 6.WEB应用的多线程以及