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

这里使用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线程Java线程Java线程

    Java线程是Java编程中的重要概念,它允许程序并发执行多个任务,提高系统资源的利用率,为多核处理器环境提供良好的支持。Java线程的创建、管理与同步是其核心内容。 1. **线程创建** - **通过实现Runnable接口**...

    java经典多线程面试题

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

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

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

    JAVA线程学习(源代码)

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

    java 线程java 线程

    当线程中抛出未捕获的异常时,线程会突然终止,除非通过try-catch-finally结构捕获并处理异常,或者使用UncaughtExceptionHandler处理未被捕获的异常。 以上就是关于Java线程的一些基础知识,包括线程的创建、状态...

    java 线程池源代码

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

    终止线程的源代码资源

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

    JAVA中的线程知识点整理

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

    Java线程状态流转图

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

    Java多线程结构_Java多线程结构_

    这种方式更适合需要从线程中获取返回值的场景。 4. Executor框架: Java 5引入了Executor框架,这是处理多线程的现代方式。ExecutorService接口是线程池的入口,它提供了一组用于管理和控制线程的方法。...

    Java多线程练习题

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

    java多线程代码demo

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

    Java多线程详解及示例

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

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

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

    java线程同步及通信

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

    java中的 双线程,举一反三

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

Global site tag (gtag.js) - Google Analytics