`
lauphai
  • 浏览: 23954 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于超时任务的实现

阅读更多

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队列自定义超时时间取消线程池任务”。 首先,`BlockingQueue`是一个并发容器,它遵循先进先出(FIFO)原则,具有阻塞性质,当队列满时,生产者线程会被阻塞...

    Java线程超时监控

    当我们提交一个任务到`ExecutorService`时,它会返回一个`Future`对象,我们可以利用这个对象来检查任务是否完成或者设置超时。 ```java ExecutorService executor = Executors.newSingleThreadExecutor(); Future...

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

    在这个项目中,我们关注的是如何利用Netty内置的时间轮(TimeWheel)工具来处理大批量的定时或超时任务。 时间轮是一种高效的数据结构,常用于实现定时器和延迟队列。它是由一系列的槽(Bucket)组成,每个槽代表一...

    Java实现任务超时处理方法

    Java实现任务超时处理方法是指在Java中对超时任务的处理,主要有两种方式:基于异步任务结果的超时获取和使用延时任务来终止超时操作。 基于异步任务结果的超时获取是通过使用Future对象来实现的。在提交任务时,会...

    springboot结合rabbitmq实现订单超时自动关闭

    至此,我们已经实现了使用Spring Boot和RabbitMQ来监控订单超时并自动关闭的功能。这个方案不仅有助于优化系统性能,还能降低系统复杂性,因为订单超时处理与主要业务流程分离,成为了一个独立的异步任务。 通过...

    C#利用Task实现任务超时多任务一起执行的方法

    C#利用Task实现任务超时多任务一起执行的方法 本文主要介绍了C#利用Task实现任务超时,多任务一起执行的相关知识点。Task是C#中的一个异步编程模型,能够帮助开发者更方便地编写异步代码。下面是本文中所涉及的知识...

    Tcpclient连接服务器连接超时设置

    它创建了一个新的`Socket`对象,然后同时启动连接任务和超时任务。当任一任务完成时,检查哪个任务先完成。如果连接任务先完成,那么创建一个新的`TcpClient`实例并返回;如果超时任务先完成,则抛出一个`...

    C#超时方法 正则超时

    标题提到的"超时方法 正则超时"是关于如何在C#中处理正则表达式执行时间过长的问题。下面将详细介绍这一主题。 首先,`OutTimeClass.cs`可能包含了一个自定义的超时类,它可能提供了设置超时时间、执行任务以及在超...

    C#函数超时执行事例

    // 如果是超时任务完成,取消函数任务并抛出异常 else { cancellationTokenSource.Cancel(); throw new TimeoutException($"函数执行超时,已取消。"); } } } ``` 在这个示例中,`ExecuteWithTimeout`方法...

    cpp-并行执行http请求支持超时设置

    在C/C++中,超时可以通过定时器(timers)实现,例如`select`、`poll`、`epoll`等系统调用,或者使用第三方库如libevent、libev和Boost.Asio。当超时发生时,程序会收到通知,然后可以选择重新发送请求或者采取其他...

    线程池和超时线程的实现(附源码)

    单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换...

    java通过线程控制程序执行超时(新)

    在Java编程中,控制程序执行超时是一项重要的任务,特别是在多线程环境下,我们可能需要确保某个任务不会无限制地运行下去,导致资源耗尽。本文将深入探讨如何使用Java的线程机制来实现程序执行的超时控制,同时也会...

    Java中实现线程的超时中断方法实例

    通过设置中断标志和延迟执行任务,可以实现请求线程的超时中断。需要注意的是,使用 Thread.interrupt() 方法不能真正中断线程,而是通知线程可以被中断。使用 ScheduledThreadPoolExecutor 可以实现延迟执行任务,...

    ZYNQ进阶之路14”博客对应源代码,该代码通过FIFO阈值触发中断和超时中断实现ZYNQ PS端uart接收不定长数据.zip

    在本文中,我们将深入探讨如何使用ZYNQ处理器系统(PS)通过FIFO阈值触发中断和超时中断来实现在UART(通用异步收发传输器)接口上接收不定长数据。首先,我们需要理解ZYNQ架构以及UART在嵌入式系统中的作用。 ZYNQ...

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

    实时任务管理器的设计及其实现

    实时任务管理器作为实时系统的核心组件,负责调度和控制任务的执行,确保所有任务在规定的时间内完成,避免因任务超时导致的数据不一致或系统崩溃等问题。 ### 二、基于截止时间的并发控制方法 #### 1. 方法概述 ...

    Java线程超时控制的实现.docx

    ### Java线程超时控制实现详解 #### 一、引言 在开发过程中,经常会遇到需要对线程执行时间进行限制的情况,例如与远程数据库的交互或网络数据的下载等耗时操作。为了提高程序的健壮性和用户体验,合理地控制这些...

    java通过线程控制程序执行超时

    在Java编程中,控制程序执行超时是一项关键任务,特别是在多线程环境下,我们需要确保某个任务不会无限期地运行,导致资源浪费或者阻塞其他重要任务。本篇将深入探讨如何利用Java的线程和定时器(Timer)来实现这个...

    Android 异步任务 设置 超时使用handler更新通知功能

    "Android 异步任务 设置 超时使用Handler更新通知功能" Android 异步任务 设置 超时使用Handler更新通知...使用AsyncTask和Handler可以实现异步任务的设置超时和更新通知功能,提高Android应用程序的性能和响应速度。

    易语言检测XML超时

    在处理XML超时的问题上,易语言提供了相应的函数和方法来帮助开发者实现这一功能。 在描述中提到了`CoInitialize`和`CoUninitialize`,这是微软COM(Component Object Model)组件中的一对初始化和卸载函数。在...

Global site tag (gtag.js) - Google Analytics