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 + "]------");
}
}
分享到:
相关推荐
"TimeOut.rar"这个压缩包文件包含了关于C#编程语言中实现超时检测的四种方法,这些方法在实际项目中具有广泛的应用价值。 首先,我们来详细探讨四种超时检测的方法: 1. **定时器(Timer)**:在C#中,可以使用`...
private void CheckThreadPool(object state, bool timeout) { int workerThreads = 0; int maxWorkerThreads = 0; int completionPortThreads = 0; // 获取线程池中当前可用的工作者线程数量和最大工作者线程...
- 在编程语言如Java、Python、C#等中,可以设置函数调用、线程执行或I/O操作的超时。例如,Python的`socket`库允许我们为网络连接设置超时值。 - 使用异步编程技术,如回调、Promise或async/await,可以更好地管理...
4. **主函数调用**:在主函数中,定义了一个名为`connect`的目标函数,并通过装饰器`@set_timeout(2, after_timeout)`设置了超时时间为2秒,以及超时后的处理函数。 #### 五、注意事项 1. **操作系统兼容性**:...
3. 连接QTimer的`timeout()`信号到你的槽函数。由于槽函数也需要在子线程中执行,因此你需要确保这个槽函数是安全的,即不会访问主线程的GUI元素。 4. 启动QThread。调用`start()`函数启动线程,此时QTimer会开始在...
例如,我们创建一个定时器,每5秒钟触发一次,然后将其信号`timeout()`连接到一个槽函数: ```cpp class WorkerThread : public QThread { Q_OBJECT public: // ... private slots: void doSomething() { // ...
标题中的"MessageBox With Timeout (14KB)"是一个小型程序,它扩展了标准的Windows MessageBox功能,添加了一个超时特性。MessageBox通常用于在应用程序中显示警告或确认消息,但默认情况下,用户必须手动点击按钮...
- `Stop(WORD timeout)`:结合了优雅停止和强制停止两种策略,先尝试优雅停止并在`timeout`时间内等待线程自行结束,超时后强制终止。 - **挂起与恢复** - `Suspend()`:调用`SuspendThread()`挂起线程。 - `...
4. **并发编程与线程**:在多线程环境中,可以使用Java的`Thread.sleep()`来模拟超时,或者使用`Future.get(long timeout, TimeUnit unit)`方法获取异步任务的结果,如果超时则抛出`TimeoutException`。 5. **...
总结来说,“cmd_timeout”是一个实用的Python工具,它扩展了`subprocess`模块的功能,为外部命令执行添加了超时控制。通过理解和使用“cmd_timeout”,我们可以使Python程序更加健壮,避免因长时间运行的命令导致的...
"前端开源库-jeefo_timeout" 是一个专门为前端开发者设计的开源库,它主要解决的是JavaScript中的异步操作超时问题。在Web应用中,我们经常遇到需要等待某个操作完成,但又不能无限期等待的情况,这时就需要设定一个...
在这个状态下,线程正在等待某个事件的发生,并且设置了等待时限,例如Object.wait(long timeout)方法的调用。只有当事件发生或时限到期后,线程才能转换到RUNNABLE状态。 TERMINATED(终止状态) TERMINATED状态是...
int timeout = 1000; PingReply reply = pingSender.SendPingAsync("192.168.1.0/24").Result; // 对整个网段进行ping if (reply.Status == IPStatus.Success) { // 网络可达,处理结果 } else { // 网络不...
在IT领域,尤其是在操作系统编程和自动化任务执行方面,"sys_herbnate_timeout_reboot"是一个有趣的话题。这个项目显然涉及到Windows XP系统,利用C++编程语言实现了一个功能,即当系统休眠达到预设时间后,能够自动...
在`run`方法中,`func`被调用并将返回值赋给`result`,然后将`result`设置为0表示线程执行完毕。这种方式可以用来判断线程是否已经完成了其任务,因为`result`初始为1,执行完后变为0。 `Threading.Thread`的其他...
例如,在实现时钟功能时,我们可以在后台线程中创建一个计时器对象(`QTimer`),并设置一个定时信号,如`timeout()`。然后,我们使用`connect()`函数将这个信号连接到主线程中的一个槽,该槽负责更新UI上的时间显示...
### 如何干净地关闭指定线程 在计算机编程中,多线程技术是实现程序并发执行的重要手段之一。然而,在实际应用中,...这种方法尤其适用于那些需要对线程执行精细控制的应用场景,例如系统服务或高性能服务器软件等。
angular.js的$timeout指令对window.setTimeout做了一个封装,它的返回值是一个promise对象.当定义的时间到了以后,这个promise对象就会被resolve,回调函数就会被执行. 如果需要取消一个timeout,调用$timeout.cancel...
通过`curl_multi_perform`可以并行执行这些请求,同时利用`curl_easy_setopt`设置超时参数,如`CURLOPT_TIMEOUT`来指定单个请求的超时时间。 压缩包中的`paw-master`可能是一个开源项目,它可能包含了实现上述功能...
比如调用`wait(long timeout)`或`sleep(long timeout)`时,线程会在指定的时间后自动变为就绪状态。 线程状态之间的转换是由Java API的方法调用触发的,如`start()`、`sleep()`、`wait()`、`join()`等。了解这些...