`
dyccsxg
  • 浏览: 205299 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类

Java中的超时机制 - 执行一段有时间限制的任务

 
阅读更多
1. 场景描述
举个例子,有时候执行一段程序需要1 ~ 10分钟才能运行完,但你最多只能等5分钟。如果5分钟以内程序能够运行完,那么直接返回正确结果;如果过了5分钟程序还没运行完,那么就中止程序的运行,直接返回一个错误结果。

2. 一个工具类(用来执行有时间限制的任务)
package org.demo.task;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class TimeoutTaskUtils {
    
	/**
	 * 执行一个有时间限制的任务
	 * @param task    待执行的任务
	 * @param seconds 超时时间(单位: 秒)
	 * @return
	 */
	public static Boolean execute(Callable<Boolean> task, int seconds)
	{
		Boolean result = Boolean.FALSE;
		ExecutorService threadPool = Executors.newCachedThreadPool();
		
		try 
		{
			Future<Boolean> future = threadPool.submit(task);
			result = future.get(seconds, TimeUnit.SECONDS);
		}
		catch (Exception e)
		{
			result = Boolean.FALSE;
			e.printStackTrace();
		}
		finally
		{
			threadPool.shutdownNow();
		}
		
		return result;
	}
}

3. 测试
package org.demo.task;

import java.util.concurrent.Callable;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		boolean result = TimeoutTaskUtils.execute(new MyTimeoutTask(), 5);
		System.out.println("result = " + result);
		System.out.println("-- finished. --");
	}

}
class MyTimeoutTask implements Callable<Boolean> {
	
	@Override
	public Boolean call() throws Exception {
		for (int i=0; i<10; i++) {
		    System.out.println("i = " + i);
			Thread.sleep(1000);
		}
		return true;
	}
}

分享到:
评论
1 楼 qiqitrue 2014-07-18  
为什么我执行了,结果报异常:
java.util.concurrent.TimeoutException执行状态:false

	at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:228)
	at java.util.concurrent.FutureTask.get(FutureTask.java:91)
	at com.cimstech.laiqi.common.demo.core.utils.TimeOutTask.execute(TimeOutTask.java:37)
	at com.cimstech.laiqi.common.demo.core.utils.TimeOutTask.main(TimeOutTask.java:53)

相关推荐

    JAVA并发编程实践-线程执行-学习笔记

    为任务设置时限是另一种重要的控制机制,它允许开发者限制任务的执行时间,防止某个任务无限制地占用资源。定时器和Future的get方法的超时版本都是实现这一目标的工具。 总的来说,Java并发编程实践中的任务执行是...

    ZooKeeper会话超时以及重连机制.pdf

    下面给出一段关键的逻辑代码片段,用于解释ZooKeeper如何处理会话终止的情况: ```java case OpCode.closeSession: // 不需要进行检查,因为会话到期线程已经将此操作加入队列,而无需拥有会话所有权。 // 这个...

    JAVA多线程编程详解-详细操作例子

    - **等待/定时器(Timed Waiting)**:线程在等待一段时间后恢复执行。 - **终止(Terminated)**:线程执行完毕或被中断。 4. **线程同步**:在多线程环境中,为了防止数据不一致性和竞态条件,Java 提供了多种...

    01-JAVA岗位笔试题(A卷)附答案

    当线程数超过核心线程数时,多余的线程将在空闲一段时间后被销毁。 - **workQueue**:任务队列。用于存放等待执行的任务。根据不同的实现,可以选择无界队列、有界队列或是优先级队列。 - **threadFactory**:线程...

    [中文]Java并发编程的艺术pdf

    - **内置锁与监视器**:每个`synchronized`块或方法都隐含了一个监视器锁,确保同一时刻只有一个线程能执行特定代码段。 - **重入锁**:`java.util.concurrent.locks.ReentrantLock`提供了比`synchronized`更灵活...

    Java高级架构必备知识点

    用于存放待处理的任务,通常由一个生产者往队列中添加任务,多个消费者从队列中取出任务并处理。 **4.2 消息队列** 消息队列用于在不同的系统之间传递消息,支持发布/订阅模式,可以实现解耦和异步处理。 **4.3 ...

    java线程案例

    - 超时等待(Timed Waiting):线程在等待一段时间后会自动唤醒。 - 结束(Terminated):线程的`run()`方法执行完毕或因异常退出。 线程同步是为了避免多线程环境下的数据竞争问题,主要包括以下几种机制: 1. `...

    java程序员面试之九阴真经

    Java通过finalize()方法提供了一种机制,允许开发者在对象不再被引用时执行清理操作,如释放外部资源等。需要注意的是,finalize()方法并不保证一定会被执行,也不建议开发者依赖此方法来确保资源释放。自Java 9起,...

    java面试题之多线程.pdf

    - **sleep()**:使当前线程休眠一段时间。 - **interrupt()**:中断线程,调用`isInterrupted()`或`interrupted()`检查中断状态。 - **同步机制**:包括`synchronized`关键字、`wait()`, `notify()`和`notifyAll...

    java多线程并发编程 核心技术应用实践

    Java多线程并发编程是Java开发中的重要领域,它涉及到如何高效地利用计算机资源,特别是在多核处理器系统中,能够显著提升程序的执行效率。在《java多线程并发编程核心技术应用实践》中,我们将深入探讨Java平台上的...

    浅析JAVA多线程.pdf

    sleep()方法让当前线程暂停执行一段时间;yield()方法让当前线程放弃CPU使用权,让其他线程有机会执行。此外,还可以通过设置优先级来影响线程调度,但Java线程优先级的使用并不保证线程的执行顺序,只是提供了一个...

    java多线程编程技术

    Java多线程编程技术是Java编程语言中的一项高级技术,其主要目的是让开发者能够编写出能够同时执行多个操作的程序,以提高程序的执行效率和响应性。在多核处理器日益普及的今天,合理运用多线程技术对于充分利用系统...

    代码编程 Java 中高级难度 笔试题(附答案)

    - 缺点:Java不允许一个类继承多个类,因此这种方式限制了类的继承。 - 实现`Runnable`接口 - 优点:灵活,可以实现多个接口。 - 缺点:相对复杂,需要手动创建`Thread`对象。 2. **synchronized关键字** - **...

    Java面向对象程序设计-并发(死锁).pptx

    5. **超时机制**:设定请求资源的超时时间,超过这个时间未获得资源,进程可以放弃并重新尝试。 6. **死锁检测与恢复**:定期检查系统状态,发现死锁后采取相应的恢复策略。 理解并发和死锁的概念,以及如何在实际...

    Spring-Security_java_

    6. **Remember Me**: Spring Security 提供了“记住我”功能,允许用户在一段时间内无需重新登录。这个功能通过在用户的浏览器中设置长期 cookie 来实现。 7. **Session Management**: 该组件管理用户会话,防止...

    2_ExecutorService源码阅读1

    它允许开发者等待一段时间,确保所有任务完成或者达到预设的超时限制。 **submit() 方法** submit() 方法用于提交任务到 ExecutorService,它可以接受 Callable 或 Runnable 作为参数。Callable 任务返回一个结果,...

    2011最新Java程序员面试笔试宝典

    - `sleep()`使当前线程暂停一段时间,释放CPU但不释放锁。 - `wait()`使线程等待直到被唤醒或超时,同时释放了锁。 #### 48. 同步和异步有何异同,在什么情况下分别使用他们?举例说明。 - **同步**:请求发送者...

    文章分类:Java编程,java面试题3

    - **`sleep()`**:让当前正在执行的线程暂停一段时间(以毫秒为单位),然后继续执行。调用`sleep()`方法不会释放对象的锁。 - **`wait()`**:使一个线程等待直到另一个线程调用该对象的`notify()`或`notifyAll()`...

    java记忆测试系统

    计时器功能可以通过Java的`javax.swing.Timer`类实现,它可以定期执行指定的任务,例如更新倒计时或者判断游戏是否超时。在处理图标匹配逻辑时,开发者可以利用数据结构,如数组或列表,存储已点击的方块信息,并...

Global site tag (gtag.js) - Google Analytics