package com.ycgh.util;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.Random;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class DelayedTasker implements Runnable{
DelayQueue<DelayedTask> queue = new DelayQueue<DelayedTask>();
public void addTask(DelayedTask e) {
queue.put(e);
}
public void removeTask() {
queue.poll();
}
public Collection<DelayedTask> getAllTasks() {
return Collections.unmodifiableCollection(queue);
}
public int getTaskQuantity() {
return queue.size();
}
public void run() {
while (!queue.isEmpty())
try {
queue.take().run();
} catch (InterruptedException e) {
System.out.println("Interrupted");
}
System.out.println("Finished DelayedTask");
}
public static class DelayedTask implements Delayed, Runnable {
private static int counter = 0;
private final int id = counter++;
private final int delta;
private final long trigger;
public DelayedTask(int delayInSeconds) {
delta = delayInSeconds;
trigger = System.nanoTime() + NANOSECONDS.convert(delta, SECONDS);
}
public long getDelay(TimeUnit unit) {
return unit.convert(trigger - System.nanoTime(), NANOSECONDS);
}
public int compareTo(Delayed arg) {
DelayedTask that = (DelayedTask) arg;
if (trigger < that.trigger)
return -1;
if (trigger > that.trigger)
return 1;
return 0;
}
public void run() {
//run all that you want to do
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ly_time = sdf.format(new java.util.Date());
System.out.println(ly_time);
System.out.println(this);
}
public String toString() {
return "[" + delta + "s]" + "Task" + id;
}
}
public static void main(String[] args) {
Random rand = new Random();
ExecutorService exec = Executors.newCachedThreadPool();
DelayedTasker tasker = new DelayedTasker();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ly_time = sdf.format(new java.util.Date());
System.out.println("现在时间是:"+ly_time);
for (int i = 0; i < 10; i++){
tasker.addTask(new DelayedTask(60));//延迟时间
}
exec.execute(tasker);
exec.shutdown();
}
}
分享到:
相关推荐
在易语言中,“启动线程”、“循环”和“延时”是三个重要的编程概念,它们在创建实时、响应式的程序中起到关键作用。 首先,我们要理解“启动线程”。在计算机编程中,线程是程序执行的最小单元,每个线程代表了...
总结来说,Java编程中的线程同步是通过wait()、notify()、notifyAll()、synchronized关键字以及阻塞队列等机制来实现的,而定时启动线程则可以借助Timer或ScheduledExecutorService。理解并熟练掌握这些工具和方法,...
### Java线程定时启动知识点详解 #### 一、概述 在Java编程中,有时我们需要让某个任务或操作在特定的时间点或每隔一段时间自动执行一次。这通常被称为“定时任务”。Java标准库提供了几种不同的方式来实现定时...
本示例将深入探讨如何在Spring框架中利用定时任务(Spring Task)启动多线程来执行并发操作。 首先,我们要了解Spring的定时任务,它基于`@Scheduled`注解实现。`@Scheduled`可以标记在方法上,表示该方法会按照...
在易语言编程中,"启动线程"是一个重要的概念,它涉及到多任务并行处理,使得程序能够同时执行多个不同的任务。线程是程序执行的基本单位,一个进程可以包含一个或多个线程。启动线程允许程序员在主线程之外创建新的...
4. **多线程**:如果定时启动的任务需要在后台运行不影响主程序,那么可能需要用到多线程技术。易语言提供线程相关的命令,如`创建线程`、`关闭线程`等,用于创建和管理后台任务。 5. **配置文件读写**:为了设置和...
本篇文章将详细探讨如何在Java中启动线程,以及相关的重要概念和技术。 1. **线程创建方式** - **实现Runnable接口**:这是最常见的创建线程的方式,只需创建一个类实现`Runnable`接口,然后在`run()`方法中编写...
综合以上,"迅雷定时器---定时启动迅雷"是一款利用VC++编程语言和Windows API开发的实用工具,它通过定时器和多线程技术实现了在指定时间自动启动迅雷下载的功能,同时兼顾了用户体验和后台任务的高效执行。...
在IT领域,多线程、启动控制台以及精确定时是三个重要的概念,尤其是在系统级编程和并发处理中。在Windows环境下,`WaitForSingleObject`函数是实现这些功能的关键工具之一。接下来,我们将深入探讨这三个知识点以及...
在Java编程语言中,启动线程是多任务处理的核心,它允许程序同时执行多个独立的任务。线程是在单个进程中运行的子任务,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和一部分堆内存。下面将详细讨论Java启动...
在IT行业中,定时启动指定程序是一项常见的需求,尤其在自动化任务和系统管理中。这里我们主要探讨的是如何使用C#编程语言来实现这一功能。C#是微软开发的一种面向对象的编程语言,它提供了丰富的库和API,可以方便...
在本例中,"RunApplication"可能是一个启动多线程定时任务邮件服务的脚本文件,它包含了配置定时任务、初始化邮件服务、启动多线程以及可能的错误处理逻辑。 结合这些信息,我们可以推测"RunApplication"脚本可能是...
7. **多线程**:如果定时启动的程序需要长时间运行或影响主程序的响应,那么可能需要使用多线程技术来异步执行任务。 通过对这份源码的学习,我们可以掌握如何在易语言中实现定时任务,同时也可以借鉴其中的设计...
在Go语言中,实现多线程定时任务是一个常见的需求,特别是在服务器端编程或者后台任务处理中。Go语言的并发模型是基于CSP(Communicating Sequential Processes)理论的,通过goroutine和channel来实现轻量级线程和...
我们可以在`init()`中启动一个线程,该线程负责执行定时任务。 下面是一个简单的例子: ```java public class AutoStartServlet extends HttpServlet { private Timer timer; @Override public void init() ...
- **处理线程启动**:当缓冲区数据达到半满状态时,处理线程开始工作,并进行处理计数。 - **同步处理**:当处理计数接近采集计数时,处理线程需要等待一定的时间,确保采集线程有足够的空间继续存储新的数据。 ...
【Tomcat定时启动与监控】 在IT运维工作中,确保服务器上的应用程序如Tomcat稳定运行是非常重要的。为了实现这一目标,可以设置定时启动和监控机制。本文主要介绍如何在Linux和Windows环境下实现Tomcat的定时启动,...
- **启动线程**:当线程被挂起后,可以使用特定的API来恢复其执行,即启动线程。启动后,线程会从上次挂起的地方继续执行,直到完成或再次被挂起。 3. **MFC线程挂起** 在MFC中,可以使用Windows API函数`...
5. **多线程**:如果定时任务可能耗时较长,为了不阻塞主程序,可以考虑使用多线程。易语言支持创建和管理线程,确保定时任务在后台异步执行。 6. **用户交互**:程序界面设计也是重要一环,需要提供友好的交互方式...
### 解决Python中定时任务线程无法自动退出的问题 在Python编程中,处理定时任务时经常需要用到`threading`模块中的`Timer`类。然而,使用`Timer`类创建的定时任务线程可能会遇到一个问题:当主程序退出时,这些...