package test.thread;
import java.util.Timer;
import java.util.TimerTask;
public class MainThread {
private Object lock = new Object();
public void waitLock() throws InterruptedException {
synchronized (lock) {
lock.wait();
}
}
public void notifyLock() {
synchronized (lock) {
lock.notify();
}
}
/**
* @param args
* 关于超时任务的实现 实现功能:处理一批任务,如果某个任务的处理时间超过最大处理时间,则终止该任务的执行,继续执行下一个任务
* 实现思路:三线程实现,处理一个任务时,启动一个任务处理线程处理方案,再启动一个定时器线程检测是否超时,并通过一个同步变量保证任务时串行执行的。
* @throws InterruptedException
*/
public static void main(String[] args) {
MainThread mainThread = new MainThread();
for (int i = 2; i <= 20; i += 2) {
System.out.println("start task!" + i);
ProccessThread proccessThread = new ProccessThread(mainThread,i * 1000);
MonitorThread monitorThread = new MonitorThread(mainThread);
long maxProccessTime = 8 * 1000;// 每个任务的最大处理时间
Timer timer = new Timer();
timer.schedule(monitorThread, maxProccessTime);
proccessThread.start();
try {
mainThread.waitLock();
} catch (InterruptedException e) {
e.printStackTrace();
}
proccessThread.stop();
timer.cancel();
System.out.println("end task!" + i);
}
}
}
/**
* 定时器线程检测
* @author liuhui
*
*/
class MonitorThread extends TimerTask {
private MainThread mt;
public MonitorThread(MainThread mt) {
super();
this.mt = mt;
}
@Override
public void run() {
System.out.println("ThreadID:" + " MonitorThread running!");
mt.notifyLock();
}
}
/**
* 任务处理线程
* @author liuhui
*
*/
class ProccessThread implements Runnable {
private MainThread mt;
private Thread thread;
private long processTime;
public static int sec = 1;
public ProccessThread(MainThread mt, long processTime) {
super();
this.mt = mt;
this.processTime = processTime;
}
private void doSomething() {
try {
// do something
// thread.sleep(100*1000); //异常情况
// thread.sleep(1*1000); //正常情况
thread.sleep(processTime); // 正常情况
System.out.println("ThreadID:" + thread.getId() + ">>> Normal Process! processTime=" + processTime);
} catch (InterruptedException e) {
// e.printStackTrace();
System.out.println("ThreadID:" + thread.getId() + ">>> AbNormal Proccess! processTime=" + processTime);
}
}
public void run() {
System.out.println("ThreadID:" + thread.getId() + ">>> starting!");
doSomething();
mt.notifyLock();
System.out.println("ThreadID:" + thread.getId() + ">>> ending ok!");
}
public void start() {
thread = new Thread(this);
thread.start();
}
public void stop() {
thread.interrupt();// 如果任务在正常时间内不能退出,认为产生interrupt,强行地退出 (run方法正常结束)
thread.stop();
try {
Thread.sleep(sec * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ThreadID:" + thread.getId() + ">>> stoping end!");
thread = null;
}
}
分享到:
相关推荐
现在我们来详细讨论如何利用这些技术实现“BlockingQueue队列自定义超时时间取消线程池任务”。 首先,`BlockingQueue`是一个并发容器,它遵循先进先出(FIFO)原则,具有阻塞性质,当队列满时,生产者线程会被阻塞...
当我们提交一个任务到`ExecutorService`时,它会返回一个`Future`对象,我们可以利用这个对象来检查任务是否完成或者设置超时。 ```java ExecutorService executor = Executors.newSingleThreadExecutor(); Future...
在这个项目中,我们关注的是如何利用Netty内置的时间轮(TimeWheel)工具来处理大批量的定时或超时任务。 时间轮是一种高效的数据结构,常用于实现定时器和延迟队列。它是由一系列的槽(Bucket)组成,每个槽代表一...
Java实现任务超时处理方法是指在Java中对超时任务的处理,主要有两种方式:基于异步任务结果的超时获取和使用延时任务来终止超时操作。 基于异步任务结果的超时获取是通过使用Future对象来实现的。在提交任务时,会...
至此,我们已经实现了使用Spring Boot和RabbitMQ来监控订单超时并自动关闭的功能。这个方案不仅有助于优化系统性能,还能降低系统复杂性,因为订单超时处理与主要业务流程分离,成为了一个独立的异步任务。 通过...
C#利用Task实现任务超时多任务一起执行的方法 本文主要介绍了C#利用Task实现任务超时,多任务一起执行的相关知识点。Task是C#中的一个异步编程模型,能够帮助开发者更方便地编写异步代码。下面是本文中所涉及的知识...
它创建了一个新的`Socket`对象,然后同时启动连接任务和超时任务。当任一任务完成时,检查哪个任务先完成。如果连接任务先完成,那么创建一个新的`TcpClient`实例并返回;如果超时任务先完成,则抛出一个`...
标题提到的"超时方法 正则超时"是关于如何在C#中处理正则表达式执行时间过长的问题。下面将详细介绍这一主题。 首先,`OutTimeClass.cs`可能包含了一个自定义的超时类,它可能提供了设置超时时间、执行任务以及在超...
// 如果是超时任务完成,取消函数任务并抛出异常 else { cancellationTokenSource.Cancel(); throw new TimeoutException($"函数执行超时,已取消。"); } } } ``` 在这个示例中,`ExecuteWithTimeout`方法...
在C/C++中,超时可以通过定时器(timers)实现,例如`select`、`poll`、`epoll`等系统调用,或者使用第三方库如libevent、libev和Boost.Asio。当超时发生时,程序会收到通知,然后可以选择重新发送请求或者采取其他...
单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换...
在Java编程中,控制程序执行超时是一项重要的任务,特别是在多线程环境下,我们可能需要确保某个任务不会无限制地运行下去,导致资源耗尽。本文将深入探讨如何使用Java的线程机制来实现程序执行的超时控制,同时也会...
通过设置中断标志和延迟执行任务,可以实现请求线程的超时中断。需要注意的是,使用 Thread.interrupt() 方法不能真正中断线程,而是通知线程可以被中断。使用 ScheduledThreadPoolExecutor 可以实现延迟执行任务,...
在本文中,我们将深入探讨如何使用ZYNQ处理器系统(PS)通过FIFO阈值触发中断和超时中断来实现在UART(通用异步收发传输器)接口上接收不定长数据。首先,我们需要理解ZYNQ架构以及UART在嵌入式系统中的作用。 ZYNQ...
解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...
实时任务管理器作为实时系统的核心组件,负责调度和控制任务的执行,确保所有任务在规定的时间内完成,避免因任务超时导致的数据不一致或系统崩溃等问题。 ### 二、基于截止时间的并发控制方法 #### 1. 方法概述 ...
### Java线程超时控制实现详解 #### 一、引言 在开发过程中,经常会遇到需要对线程执行时间进行限制的情况,例如与远程数据库的交互或网络数据的下载等耗时操作。为了提高程序的健壮性和用户体验,合理地控制这些...
在Java编程中,控制程序执行超时是一项关键任务,特别是在多线程环境下,我们需要确保某个任务不会无限期地运行,导致资源浪费或者阻塞其他重要任务。本篇将深入探讨如何利用Java的线程和定时器(Timer)来实现这个...
"Android 异步任务 设置 超时使用Handler更新通知功能" Android 异步任务 设置 超时使用Handler更新通知...使用AsyncTask和Handler可以实现异步任务的设置超时和更新通知功能,提高Android应用程序的性能和响应速度。
在处理XML超时的问题上,易语言提供了相应的函数和方法来帮助开发者实现这一功能。 在描述中提到了`CoInitialize`和`CoUninitialize`,这是微软COM(Component Object Model)组件中的一对初始化和卸载函数。在...