`
yunzhu
  • 浏览: 1146495 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
B2b19957-cda7-3a9e-83a0-418743feb0ca
监控应用服务器
浏览量:110080
2e8be8be-e51f-346c-bcdd-12623c9aa820
Web前端开发
浏览量:119850
Bfa5df64-a623-34b9-85b8-ef3ce2aed758
经典异常的解决
浏览量:204730
社区版块
存档分类
最新评论
阅读更多

这里使用JDK5+的java.util.concurrent包下的API实现,采用这种方式是相对比较安全的。

 

实现效果:

启动一个子任务,然后等待子任务的计算结果同时设定一个超时时间,如果等待时间超出预设定的超时时间,则中断子任务。

 

代码实现:

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;
	}
}

 

运行结果:

Start ...
----------------------------------------------------------------------------------------------------
taskResult : true
failReason : null
---------------------------------------------
taskResult : null
failReason : 主线程等待计算结果超时,因此中断任务线程!
End!

 

 

 

 

4
6
分享到:
评论
2 楼 Nabulio 2016-08-16  
  
1 楼 timer_yin 2016-01-13  
问下楼主
testTask(exec, 15); // 任务成功结束后等待计算结果,不需要等到15秒 
testTask(exec, 5); // 只等待5秒,任务还没结束,所以将任务中止
最坏的情况下这个例子(不计MyTask10秒的耗时),主线程将耗时20秒
能不能实现 这两个任务不是串行 而是并行,已最慢的主 比如这个例子 我主线程最多耗时15秒而不是20秒

相关推荐

    Java线程超时监控

    本文将深入探讨Java中如何实现单个线程的执行超时监控。 首先,我们可以使用`java.util.concurrent`包中的`Future`和`ExecutorService`来实现线程超时。`ExecutorService`是一个接口,它提供了管理和控制线程池的...

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

    java多线程经典案例

    本案例将深入探讨Java多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致数据不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口...

    java经典多线程面试题

    - java.util.concurrent包中提供了一些线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,这些集合类能够在多线程环境下提供更安全且效率更高的数据操作。 11. Java中ReentrantLock和synchronized...

    安全的编写多线程的_Java_应用程序

    本文将详细介绍如何安全地编写多线程Java应用程序,避免最常见的问题,并提供一些实用的解决方案。 #### 二、多线程基础 **1. 线程概念** - **定义**: 线程是程序执行流的最小单元,是进程内的一个执行实体。一个...

    JAVA线程学习(源代码)

    我们可以使用`uncaughtExceptionHandler`来处理线程中抛出的未捕获异常。 总的来说,"JAVA线程学习(源代码)"涵盖了Java线程的基础知识和高级特性,包括线程的创建、管理、同步和通信。通过分析和实践这些源代码,你...

    java 线程池源代码

    3. `keepAliveTime`: 当线程数超过核心线程数时,空闲线程等待新任务的最长时间,超时会被终止。 4. `unit`: keepAliveTime的时间单位。 5. `workQueue`: 任务队列,用于存储待执行的任务。常见的有`...

    终止线程的源代码资源

    - **停止**:Java标准库未提供直接终止线程的方法,但可以使用volatile变量、Thread.stop()(不推荐)或共享数据来模拟停止。 3. **为什么不能直接终止线程** - **线程安全**:直接终止可能导致正在执行的关键...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    JAVA中的线程知识点整理

    直接调用`run()`方法只会在一个线程中执行,不会创建新线程。 2. **`Callable`与`Future`接口** - `Callable`接口类似于`Runnable`,但它允许返回一个结果。实现`Callable`的类需要定义一个`call()`方法,该方法...

    Java线程状态流转图

    Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java...

    java多线程编程总结

    该接口只有一个方法 `void run()` ,使用实现此接口的对象创建线程时,启动该线程会导致在独立执行的线程中调用对象的 `run` 方法。 - **实例化线程** 1. 如果是扩展 `java.lang.Thread` 类的线程,则可以直接使用 ...

    Java多线程练习题

    Java中的线程有五种状态:新建(New)、就绪(Runnable)、运行(Running)、等待/阻塞(Blocked)、终止(Terminated)。了解这些状态以及它们之间的转换对于理解多线程的执行流程非常重要。 三、线程同步 1. ...

    java多线程代码demo

    7. **线程状态**:Java中的Thread类定义了线程的五种状态:新建(NEW)、可运行(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)和终止(TERMINATED)。理解这些状态有助于调试和优化多线程程序。 8. **异常处理**...

    Java多线程详解及示例

    3. 多线程中的死锁与活锁 在多线程环境下,死锁是指两个或多个线程相互等待对方释放资源,导致它们都无法继续执行。活锁则是指线程不断重试获取资源,但由于其他线程持有资源不释放,导致线程陷入无限循环的状态。...

    java线程同步及通信

    在`Callme.java`的`f1()`、`f2()`和`f3()`中,`synchronized`关键字确保每次只有一个线程可以执行这些方法,确保了`j`变量的更新是线程安全的。 5. **死锁**和**活锁**: 虽然示例中未直接涉及,但在实际应用中,...

    java中的 双线程,举一反三

    3. **线程状态**:Java线程有五种状态:新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。线程状态的转换是理解和调试多线程程序的关键。 4. **死锁**:当两个或更多线程...

    java面试题之多线程.pdf

    Java中的多线程是面试中常见的话题,因为它在并发编程中扮演着重要角色。线程允许应用程序同时执行多个任务,从而提高系统效率和响应性。理解线程的概念、创建方式以及状态转换对于Java开发者至关重要。 1. **线程...

    Java多线程编程实例

    本书“Java多线程编程实例”深入浅出地讲解了如何在Java环境中实现多线程操作,尽管出版时间较早,但其内容的经典性和实用性使其在现代开发中仍具有极高的参考价值。 首先,我们要理解Java中的线程是如何创建的。...

    java多线程tcp查询

    在Java编程语言中,多线程TCP查询是网络编程中的一个重要概念,主要涉及如何通过TCP协议在多个线程中处理客户端请求。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,...

Global site tag (gtag.js) - Google Analytics