3个答案 按时间排序 按投票排序
-
import java.util.concurrent.Callable; 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 Chen Feng */ public class TaskTimeoutDemo { public static void main(String[] args) { System.out.println("Start ..."); ExecutorService exec = Executors.newCachedThreadPool(); testTask(exec, 15); // 任务成功结束后等待计算结果,不需要等到15秒 testTask(exec, 5); // 只等待5秒,任务还没结束,所以将任务中止 exec.shutdown(); System.out.println("End!"); } public static void testTask(ExecutorService exec, int timeout) { MyTask task = new MyTask(); Future<Boolean> future = exec.submit(task); Boolean taskResult = null; String failReason = null; try { // 等待计算结果,最长等待timeout秒,timeout秒后中止任务 taskResult = future.get(timeout, TimeUnit.SECONDS); } catch (InterruptedException e) { failReason = "主线程在等待计算结果时被中断!"; } catch (ExecutionException e) { failReason = "主线程等待计算结果,但计算抛出异常!"; } catch (TimeoutException e) { failReason = "主线程等待计算结果超时,因此中断任务线程!"; exec.shutdownNow(); } System.out.println("\ntaskResult : " + taskResult); System.out.println("failReason : " + failReason); } } class MyTask implements Callable<Boolean> { @Override public Boolean call() throws Exception { // 总计耗时约10秒 for (int i = 0; i < 100L; i++) { Thread.sleep(100); // 睡眠0.1秒 System.out.print('-'); } return Boolean.TRUE; } }
2013年4月02日 13:08
-
采用JDK5+ 中的API实现很简单,而且安全。
这是我刚刚特地发的一篇博客,里面写了一个简单的例子:
控制Java线程超时后中止的方案
http://yunzhu.iteye.com/blog/1838617
2013年3月29日 12:20
相关推荐
在Java编程中,多线程是并发执行任务的重要方式,然而在实际应用中,我们可能会遇到某些线程执行时间过长或死锁的情况,这可能导致系统资源的浪费甚至整体性能下降。因此,对线程进行超时监控是必要的,以确保程序的...
例如,我们可能需要在超时时停止一个正在执行的长时间方法,这可以通过反射获取该方法的`Method`对象,并调用`invoke()`方法来实现。 总结来说,Java通过线程和定时器可以有效地控制程序执行超时,结合反射可以在...
在读写操作中,通常会用到`ReentrantLock`(可重入锁)配合`Condition`来实现对共享资源的精确控制,确保在特定时刻只有一个线程进行读或写操作,从而避免数据不一致。 线程控制的实践不仅关乎性能,还直接影响程序...
`Thread`类提供了一个`join`方法,可以通过传递一个时间参数来等待线程结束或超时。这种方法主要用于在外部管理线程的超时情况。 ##### 1. 实现原理 - **外部管理类**:调用目标线程的`join`方法,并传递一个超时...
在Java编程中,`BlockingQueue`是一个非常重要的并发工具类,它主要用于线程间的数据通信。`newFixedThreadPool`是`java.util.concurrent`包中的一个线程池工厂方法,用于创建固定数量线程的线程池。`FutureTask`则...
解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...
在Java编程中,超时控制是一项关键的技术,用于确保程序执行不会无限制地等待某个操作完成,例如网络请求、数据库查询或线程同步等。它主要用于避免程序因长时间阻塞而引发的性能问题或者死锁状况。这篇我们将深入...
ManualResetEvent是一个超时等待的线程锁,如果超时返回false,接收指令显示true,但是没法实现在超时后让他继续等待,这种需求我们可以用在以下场景: 控制线程超时方法 1.[主线程]:请求方发送请求,立即创建超时等待...
概述:在 Java 中实现线程的超时中断是非常重要的,特别是在熔断降级组件中。熔断降级组件需要在指定的超时时间内中断请求线程,以避免请求长时间阻塞系统资源。在这篇文章中,我们将介绍如何在 Java 中实现线程的...
在“java多线程控制小球程序”这个项目中,我们看到一个具体的应用场景:多个小球在一个框内不断弹跳,并且这些小球可能在不同的时间发射。这样的设计可以模拟现实世界的物理现象,例如弹珠台或者粒子碰撞,同时也是...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
在JavaCV中,我们可能需要创建多个线程来处理不同的任务,比如一个线程负责捕获摄像头的视频流,另一个线程则负责将这些流推送到远程服务器。`Thead2.java`文件可能就是实现此类多线程操作的示例代码。 在`...
- 线程互斥(Mutual Exclusion)是指多个线程在同一时刻只有一个能进入临界区(Critical Section),也就是访问共享资源的那段代码。 4. synchronized关键字的用法有哪些? - 在方法上使用,对当前对象实例进行...
synchronized用于方法或代码块,可以保证同一时间只有一个线程执行特定代码,避免数据冲突。Lock接口提供更细粒度的锁控制,支持公平锁、非公平锁、读写锁等,提高并发性能。 线程通信是线程间交换信息的过程,主要...
3. `newCachedThreadPool()`: 创建一个可缓存的线程池,当线程空闲超过60秒,线程会自动终止,适合处理大量短生命周期的任务。 4. `newScheduledThreadPool(int corePoolSize)`: 创建一个定长的线程池,支持定时及...
在Java编程中,多线程是并发处理任务的关键技术,它允许程序同时执行多个不同的任务。本篇文章将深入探讨如何实现线程的协同、停止、暂停以及继续等操作,这些都是多线程编程中的核心概念。 1. **线程的协同(协作...
标题所提及的场景是一个Java多线程环境,涉及到两个线程——ThreadA和ThreadB,它们分别执行Service类中的methodA()和methodB()方法。这两个方法分别同步在不同的对象上,即object1和object2。在这种情况下,线程A在...
- 同步:确保同一时间只有一个线程访问共享资源,防止数据不一致。Java提供了synchronized关键字以及Lock接口(如ReentrantLock)来实现同步。 - volatile:修饰变量,确保多线程环境下的可见性和有序性,但不保证...
- **同步代码块**: 使用`synchronized`关键字声明同步代码块,确保同一时间只有一个线程执行。 - **同步方法**: 在方法声明前加上`synchronized`关键字,使整个方法成为同步方法。 - **示例**: 对于一个共享资源...
一个线程从A表读数据放入队列 N个线程从队列中取出数据,找到其在子表中的数据 对子表中的数据开3种线程:读,发email,标记状态 N个线程对完成的A表数据做最后处理 支持大数据量跑批,就是个例子,本来是公司发送...