`
simonhoo
  • 浏览: 70362 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA处理线程超时

 
阅读更多

在实际业务中,由其是多线程并开业务中,经常会遇到某个线程执行超时。而程序如果不捕获这类情况,就会导致程序一直处于等待状态,从而影响后续线程的运行。
比如说网络通迅、单任务下的复杂数据库查询等,通常处理这类问题,可以启用一个后台守护线程来监控用户线程(业务线程)的执行是否超时,如果超时就不在等待,这种做法,通常是在调用用户线程的.start()方法之前,调用守护线程的start()方法,同时将超时时长传给守护线程。在守护线程的run()方法,执行sleep()方法,休眠时间为超时时长,守护线程中有一个同步后的变量用于存储用户线程是否超时。而在用户线程中,在程序执行完之后,再调用守掮线程改变同步变量。当守护线程sleep()方法之后,去有判断同步变量的值是否已改变,如果没有改变,说明用户线程还未扫行完毕,也就是超时。但这种方法,不能中断用户线程。
除此之外,还有一种方法,可以中断用户线程不在继续运行,采用java.util.concurrent下面的接口、类也可以完成。以下是例子。

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;

public class TimeOut {
	public static void main(String[] args){
		int timeout = 2; //秒.
		ExecutorService executor = Executors.newSingleThreadExecutor();
		Boolean result = false;   
        Future<Boolean> future = executor.submit(new MyJob("请求参数"));// 将任务提交到线程池中   
        try {   
            result = future.get(timeout*1000, TimeUnit.MILLISECONDS);// 设定在200毫秒的时间内完成 
            System.out.println(result);
        } catch (InterruptedException e) {
        	System.out.println("线程中断出错。");
        	future.cancel(true);// 中断执行此任务的线程   
        } catch (ExecutionException e) {   
        	System.out.println("线程服务出错。");
        	future.cancel(true);// 中断执行此任务的线程   
        } catch (TimeoutException e) {// 超时异常   
        	System.out.println("超时。");   
            future.cancel(true);// 中断执行此任务的线程   
        }finally{
        	System.out.println("线程服务关闭。");
        	executor.shutdown();
        }
	}
	
	static class MyJob implements Callable<Boolean> {  
		private String t;
		public MyJob(String temp){
			this.t= temp;
		}
        public Boolean call() {   
        	for(int i=0;i<999999999;i++){
				if(i==999999997){
					System.out.println(t);
				}
				if (Thread.interrupted()){ //很重要
                    return false;   
                }
			} 
            System.out.println("继续执行..........");   
            return true;   
        }   
    } 
}

 

1
3
分享到:
评论
1 楼 sjzheng803 2012-07-02  
不知道你有没有在多线程中试过,我用Future试多线程,就会出很多问题,比如:设置的超时时间是所有任务要执行的时间,不是每个线程的超时时间,还有楼主的例子的话,返回值没有意义,你试一下如果超时的话,你用Future取返回的false值能不能取到!求解答~

相关推荐

    Java线程超时监控

    首先,我们可以使用`java.util.concurrent`包中的`Future`和`ExecutorService`来实现线程超时。`ExecutorService`是一个接口,它提供了管理和控制线程池的能力,而`Future`则表示异步计算的结果。当我们提交一个任务...

    java通过线程控制程序执行超时(新)

    在Java编程中,控制程序执行超时是一项重要的任务,特别是在多线程环境下,我们可能需要确保某个任务不会无限制地运行下去,导致资源耗尽。本文将深入探讨如何使用Java的线程机制来实现程序执行的超时控制,同时也会...

    java通过线程控制程序执行超时

    在Java编程中,控制程序执行超时是一项关键任务,特别是在多线程环境下,我们需要确保某个任务不会无限期地运行,导致资源浪费或者阻塞其他重要任务。本篇将深入探讨如何利用Java的线程和定时器(Timer)来实现这个...

    java多线程经典案例

    Java提供了三种线程状态:新建(New)、运行(Runnable)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)。阻塞状态通常发生在线程等待I/O操作完成、调用sleep()方法、等待锁...

    Java线程超时控制的实现.docx

    ### Java线程超时控制实现详解 #### 一、引言 在开发过程中,经常会遇到需要对线程执行时间进行限制的情况,例如与远程数据库的交互或网络数据的下载等耗时操作。为了提高程序的健壮性和用户体验,合理地控制这些...

    Java中实现线程的超时中断方法实例

    Java中实现线程的超时中断方法实例 概述:在 Java 中实现线程的超时中断是非常重要的,特别是在熔断降级组件中。熔断降级组件需要在指定的超时时间内中断请求线程,以避免请求长时间阻塞系统资源。在这篇文章中,...

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

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

    线程超时死掉

    Future接口是Java线程Future模式的实 现,可以来进行异步计算。 Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便...

    java 多线程并发实例

    消费者线程则负责取出数据进行处理。Java的BlockingQueue接口(如ArrayBlockingQueue)非常适合实现这一模型,它提供了线程安全的数据插入和移除操作。 在实例中提到的"全部开始 全部停止 单个停止"可能涉及到线程...

    Java多线程练习题

    Thread类提供了interrupt()方法用于中断线程,但是需要注意的是,中断并不是立即停止线程,而是设置一个中断标志,线程需要在适当的地方检查这个标志并处理中断。 通过对以上知识点的深入理解和实践,开发者可以...

    java多线程.pdf

    Java线程调度策略遵循操作系统的线程调度机制,同时也提供了设置线程优先级的功能,但需要注意的是,线程的优先级仅作为提示性的信息,并不能完全保证线程的实际执行顺序。 #### 五、案例分析 假设我们需要开发一...

    Java多线程详解及示例

    Java提供了ExecutorService和ThreadPoolExecutor类来管理线程,创建线程池可以有效控制并发线程的数量,减少线程的创建和销毁开销。线程池的基本使用如下: ```java ExecutorService executor = Executors....

    java多线程详解(比较详细的阐述了多线程机制)

    Java多线程还涉及到线程中断和异常处理,Thread类提供了interrupt()方法发起中断请求,线程可以通过检查isInterrupted()或isInterrupted()状态响应中断。在多线程环境中,异常处理也需特别注意,合理的try-catch-...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1. **创建线程** 在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。...

    Java多线程编辑核心技术

    Java多线程是Java编程语言的重要特性之一,它允许开发者在单个程序中同时运行多个部分,这些部分可以并发执行。掌握Java多线程技术对于设计高效的并发程序、充分利用多核处理器资源、提高应用程序的执行效率至关重要...

    java多线程编程

    线程池可以通过设置核心线程数、最大线程数、队列大小和超时策略等参数进行定制。 Java并发库还包含其他高级特性,如Future和Callable接口,它们可以获取线程执行的结果;CyclicBarrier和CountDownLatch用于线程间...

    JAVA多线程端口扫描器

    5. **异常处理**:在进行网络操作时,如Socket连接失败或超时,都需要捕获并处理异常。Java的try-catch-finally语句块是处理异常的标准方式,有助于提高程序的健壮性。 6. **用户界面(可选)**:如果项目包含了...

    java 多线程编程指南

    Java提供了多种控制线程的方法,如start()启动线程,run()执行线程任务,sleep()让线程暂时休眠,join()等待其他线程结束,yield()让当前线程暂停,让其他线程有机会运行,以及设置优先级等。 并发控制是多线程编程...

    Java同步线程模型分析与改进

    // 超时处理逻辑 } ``` #### 四、优势与意义 通过以上改进措施,Java同步线程模型能够更好地适应现代高性能并发编程的需求: - **增强灵活性**:扩展后的`synchronized`关键字和`wait()`方法提供了更多控制选项...

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

    Java线程有10个优先级,从Thread.MIN_PRIORITY(1)到Thread.MAX_PRIORITY(10),但实际操作中,优先级的影响力并不大,操作系统调度策略可能会忽略优先级。 总之,理解和掌握Java多线程结构对于编写高效的并发...

Global site tag (gtag.js) - Google Analytics