`
623deyingxiong
  • 浏览: 188345 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

为线程执行设置timeout

阅读更多
package com.test.threads;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * @author Hawkins
 *
 *
 *在指定时间内执行某个task,超时则退出执行。
 */
public class TimedCall {
	public static void main(String[] args) throws InterruptedException,
			ExecutionException, TimeoutException {
		long timeout = 1000;// 任务必须在设定时间内完成,否则任务将被强制关闭
		long timeNeed = 2000;// 任务完成需要的时长。
		TimeUnit timeUnit = TimeUnit.MILLISECONDS;// 时间单位
		ExecutorService executor = Executors.newSingleThreadExecutor();// 高级并发API

		Runnable task = new MyThread(timeNeed, timeUnit);

		while (!timedCall(executor, task, timeout, timeUnit))
			;// 在某些场景下,需要不断尝试执行任务,直到能够在限定时间内执行完毕。

	}

	private static boolean timedCall(ExecutorService executor, Runnable c,
			long timeout, TimeUnit timeUnit) throws InterruptedException,
			ExecutionException {
		// FutureTask<?> task = new FutureTask<Object>(c, null);
		// executor.execute(task);
		//		
		// task.get(timeout, timeUnit);
		Future<?> future = executor.submit(c);
		try {
			future.get(timeout, timeUnit);
			return true;
		} catch (TimeoutException e) {
			future.cancel(true);// 参数设为true,向执行线程发送中断通知。否则,允许已经启动的线程继续执行直到完成任务。
			System.err.println("任务执行超时,强制退出");
			return false;
		}
	}
}

class MyThread implements Runnable {
	long timeLong = 0;// how long thread running will cost
	TimeUnit timeUnit;

	public MyThread() {
	}

	public MyThread(long milli, TimeUnit timeUnit) {
		this.timeLong = milli;
		this.timeUnit = timeUnit;
	}

	@Override
	public void run() {
		System.out.println("---------" + Thread.currentThread().getName()
				+ "开始执行,时长[" + timeLong + "]------");
		try {
			Thread.sleep(timeLong);
		} catch (InterruptedException e) {
			System.err.println("线程中断,退出");
			return;// 必须响应中断,否则无法退出线程。在退出之前你可能还需做一些资源回收等等。
		}
		System.out.println("---------" + Thread.currentThread().getName()
				+ "执行完毕,时长[" + timeLong + "]------");

	}
}
0
0
分享到:
评论
2 楼 623deyingxiong 2013-01-08  
xianan3147 写道
HI,我看完你的代码,发现有一个问题,如果想同时起多个MyThread 有的线程执行快,有的执行慢,但是给一个统一的过期时间,这时候怎么做???Future<?> future = executor.submit(c); 这个貌似只能监听一个线程

你需要起来几个线程,就调用几次timedCall。
1 楼 xianan3147 2013-01-07  
HI,我看完你的代码,发现有一个问题,如果想同时起多个MyThread 有的线程执行快,有的执行慢,但是给一个统一的过期时间,这时候怎么做???Future<?> future = executor.submit(c); 这个貌似只能监听一个线程

相关推荐

    angularjs之$timeout指令详解

    angular.js的$timeout指令对window.setTimeout做了一个封装,它的返回值是一个promise对象.当定义的时间到了以后,这个promise对象就会被resolve,回调函数就会被执行. 如果需要取消一个timeout,调用$timeout.cancel...

    线程超时死掉

    V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类...

    pytest-timeout

    终止可能是正常的,也可能不是正常的,请参阅下文,但是中止时,它将显示当时正在运行的所有线程的堆栈转储。 在连续集成服务器下运行测试时,或者仅在您不知道测试套件为什么挂起时,这很有用。 笔记 虽然默认...

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 ...obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    C#基于异步事件回调多线程容器

    //测试的时候你会看见有异常,那是应为Timeout我采用的是Thread.Abort方法,这样才出发了ontimeout事件 var worker = new Sehui.Worker(5, key.ToString(), (Func, string&gt;)workers[key], false, new TimeSpan(0, 0,...

    Python多线程编程简单介绍

    创建线程 格式如下 复制代码 代码如下: threading.Thread(group=None, target=None, name=None, args=(), kwargs={}) 这个构造器必须用关键字传参调用 ...join(timeout=None) 程序挂起,直到线程结束;如果给了 timeout

    Delphi多线程编程之三 同步读写全局数据

    WAIT_TIMEOUT 等待的时间已过,对象仍然是非发信号状态 再次声明,当一个互斥对象不再被一个线程所拥有,它就处于发信号状态。此时首先调用WaitForSingleObject()函数的线程就成为该互斥对象的拥有者,此互斥对象...

    python线程join方法原理解析

    这篇文章主要介绍了python线程join方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作...3 join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,即如果主线程等待timeout,子线程还

    CyclicBarrier用法.docx

    它的作用类似于CountDownLatch,可以让一个或多个线程等待其他线程执行完毕后再继续执行。 CyclicBarrier可以被看作是一个屏障,当所有线程都到达这个屏障时,所有线程才能继续执行。与CountDownLatch不同的是,...

    Python线程障碍对象Barrier原理详解

    action — 是一个可调用函数,当等待的线程到达了线程障碍数量parties,其中一个线程会首先调用action 对应函数,之后再执行线程自己内部的代码; timeout — 默认的超时时间; 二.线程障碍对象Bar

    了解一下Delphi的线程知识.rar

     如果等待超时,该函数返回WAIT_TIMEOUT。  如果该函数失败,返回WAIT_FAILED。  可以通过下面的代码来判断:  DWORD dw = WaitForSingleObject(hProcess, 5000); //等待一个进程结束  ReleaseMutex()函数...

    Python线程中对join方法的运用的教程

    因此 ,可以对join加一个超时操作 , join([timeout]),超过设置时间,就不再阻塞线程 jion加上还有一个后果就是, 子线程和主线程绑定在一起 , 直到子线程运行完毕,才开始执行子线程。 代码 有join: 在CODE上...

    linux 下socket通信中select的用法实例

    可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,...

    async-in-c:使用线程的C中的异步行为

    异步输入 使用线程的C中的异步行为 注意:该程序使用POSIX线程... 使用time命令以秒为单位检查执行速度。 time ./a.out 异步行为 注释第90和91 。 取消注释线94和95 。 请按照上一节(同步行为)中的步骤进行操作。

    Go语言如何并发超时处理详解

    并发一个函数,等待1s后向timeout写入数据,在select中如果1s之内有数据向其他channel写入则会顺利执行,如果没有,这是timeout写入了数据,则我们知道超时了。 实现代码: package main import fmt import time ...

    mysql数据库my.cnf配置文件

    innodb_lock_wait_timeout = 120 # InnoDB事务在被回滚之前可以等待一个锁定的超时秒数。InnoDB在它自己的锁定表中自动检测事务死锁并且回滚事务。InnoDB用LOCK TABLES语句注意到锁定设置。默认值是50秒 bulk_insert...

    C#中的多线程超时处理实践方案

    最近我正在处理C#中关于timeout行为的一些bug。解决方案非常有意思,所以我在这里分享给广大博友们。 我要处理的是下面这些情况: 我们做了一个应用程序,程序中有这么一个模块,它的功能向用户显示一个消息对话框...

    Loadrunner报错日志

    Run-Time Setting(运行时设置) -- Internet Protocol -- Preferences -- Option -- Step download timeout(sec)改为15000(根据需要可能更大) 2.Loadrunner报错日志: Action.c(39):错误-27796:连接服务器“test...

    在同步代码结束后,使用ReleaseMutex(THandle

    WAIT_TIMEOUT 等待的时间已过,对象仍然是非发信号状态 再次声明,当一个互斥对象不再被一个线程所拥有,它就处于发信号状态。此时首先调用WaitForSingleObject()函数的线程就成为该互斥对象的拥有者,此互斥对象...

    多线程,多显示场景图形设计

    飞行模拟程序通过窗口输出(out-the-window)的图像生成 频率要求为 60Hz 或者更高,这样显示的内容才不会发生异常。而 30Hz,20Hz 或者 15Hz 的频率则是“可交互”的,即,视口可以交由用户进行操控,并在合适的...

Global site tag (gtag.js) - Google Analytics