`
623deyingxiong
  • 浏览: 190363 次
  • 性别: 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); 这个貌似只能监听一个线程

相关推荐

    TimeOut.rar

    "TimeOut.rar"这个压缩包文件包含了关于C#编程语言中实现超时检测的四种方法,这些方法在实际项目中具有广泛的应用价值。 首先,我们来详细探讨四种超时检测的方法: 1. **定时器(Timer)**:在C#中,可以使用`...

    C#判断线程池中所有的线程是否已经完成

    private void CheckThreadPool(object state, bool timeout) { int workerThreads = 0; int maxWorkerThreads = 0; int completionPortThreads = 0; // 获取线程池中当前可用的工作者线程数量和最大工作者线程...

    timeout.zip

    - 在编程语言如Java、Python、C#等中,可以设置函数调用、线程执行或I/O操作的超时。例如,Python的`socket`库允许我们为网络连接设置超时值。 - 使用异步编程技术,如回调、Promise或async/await,可以更好地管理...

    python 限制函数执行时间,自己实现timeout的实例

    4. **主函数调用**:在主函数中,定义了一个名为`connect`的目标函数,并通过装饰器`@set_timeout(2, after_timeout)`设置了超时时间为2秒,以及超时后的处理函数。 #### 五、注意事项 1. **操作系统兼容性**:...

    c++与Qt实现把定时器放进子线程中运行

    3. 连接QTimer的`timeout()`信号到你的槽函数。由于槽函数也需要在子线程中执行,因此你需要确保这个槽函数是安全的,即不会访问主线程的GUI元素。 4. 启动QThread。调用`start()`函数启动线程,此时QTimer会开始在...

    QTimer在子线程里执行例子

    例如,我们创建一个定时器,每5秒钟触发一次,然后将其信号`timeout()`连接到一个槽函数: ```cpp class WorkerThread : public QThread { Q_OBJECT public: // ... private slots: void doSomething() { // ...

    MessageBox With Timeout (14KB)

    标题中的"MessageBox With Timeout (14KB)"是一个小型程序,它扩展了标准的Windows MessageBox功能,添加了一个超时特性。MessageBox通常用于在应用程序中显示警告或确认消息,但默认情况下,用户必须手动点击按钮...

    cmd_timeout:使用超时运行外部命令的实用程序

    总结来说,“cmd_timeout”是一个实用的Python工具,它扩展了`subprocess`模块的功能,为外部命令执行添加了超时控制。通过理解和使用“cmd_timeout”,我们可以使Python程序更加健壮,避免因长时间运行的命令导致的...

    VC 线程封装类 简单易懂

    - `Stop(WORD timeout)`:结合了优雅停止和强制停止两种策略,先尝试优雅停止并在`timeout`时间内等待线程自行结束,超时后强制终止。 - **挂起与恢复** - `Suspend()`:调用`SuspendThread()`挂起线程。 - `...

    time_out_program.zip_Time_time out softwa

    4. **并发编程与线程**:在多线程环境中,可以使用Java的`Thread.sleep()`来模拟超时,或者使用`Future.get(long timeout, TimeUnit unit)`方法获取异步任务的结果,如果超时则抛出`TimeoutException`。 5. **...

    前端开源库-jeefo_timeout

    "前端开源库-jeefo_timeout" 是一个专门为前端开发者设计的开源库,它主要解决的是JavaScript中的异步操作超时问题。在Web应用中,我们经常遇到需要等待某个操作完成,但又不能无限期等待的情况,这时就需要设定一个...

    Java线程状态流转图

    在这个状态下,线程正在等待某个事件的发生,并且设置了等待时限,例如Object.wait(long timeout)方法的调用。只有当事件发生或时限到期后,线程才能转换到RUNNABLE状态。 TERMINATED(终止状态) TERMINATED状态是...

    关于winform使用timer进行多线程操作的例子

    int timeout = 1000; PingReply reply = pingSender.SendPingAsync("192.168.1.0/24").Result; // 对整个网段进行ping if (reply.Status == IPStatus.Success) { // 网络可达,处理结果 } else { // 网络不...

    sys_herbnate_timeout_reboot

    在IT领域,尤其是在操作系统编程和自动化任务执行方面,"sys_herbnate_timeout_reboot"是一个有趣的话题。这个项目显然涉及到Windows XP系统,利用C++编程语言实现了一个功能,即当系统休眠达到预设时间后,能够自动...

    判断Threading.start新线程是否执行完毕的实例

    在`run`方法中,`func`被调用并将返回值赋给`result`,然后将`result`设置为0表示线程执行完毕。这种方式可以用来判断线程是否已经完成了其任务,因为`result`初始为1,执行完后变为0。 `Threading.Thread`的其他...

    Qt5 多线程实现时钟和倒计时

    例如,在实现时钟功能时,我们可以在后台线程中创建一个计时器对象(`QTimer`),并设置一个定时信号,如`timeout()`。然后,我们使用`connect()`函数将这个信号连接到主线程中的一个槽,该槽负责更新UI上的时间显示...

    怎样干净的关闭指定线程

    ### 如何干净地关闭指定线程 在计算机编程中,多线程技术是实现程序并发执行的重要手段之一。然而,在实际应用中,...这种方法尤其适用于那些需要对线程执行精细控制的应用场景,例如系统服务或高性能服务器软件等。

    angularjs之$timeout指令详解

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

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

    通过`curl_multi_perform`可以并行执行这些请求,同时利用`curl_easy_setopt`设置超时参数,如`CURLOPT_TIMEOUT`来指定单个请求的超时时间。 压缩包中的`paw-master`可能是一个开源项目,它可能包含了实现上述功能...

    Java多线程-线程的生命周期

    比如调用`wait(long timeout)`或`sleep(long timeout)`时,线程会在指定的时间后自动变为就绪状态。 线程状态之间的转换是由Java API的方法调用触发的,如`start()`、`sleep()`、`wait()`、`join()`等。了解这些...

Global site tag (gtag.js) - Google Analytics