`
kakarot_java
  • 浏览: 163679 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 超时 实现

阅读更多
有一个需求,就是当一个方法执行超时的时候就中断该方法.
java的超时实现,在网上搜到的大部分是:
方法1.(由于不能达到预想的目的 就不列出来了)
  实现描述:使用一个守护线程作为计时器,并且在计时结束时抛出一个未检测异常。
方法2.
   用join,就是在主线程里开一个子线程(t),在子线程里去处理超时任务,主线程t.join(3000),3000为要等待的时间(ms),如果子线程没有超时则正常继续执行,如果超时了则中断该子线程t.interrupt();
   代码如下:
  
public class ThreadTest {

    public static void main(String[] args) {
   
        CounterThread ct = new CounterThread(5000);
     
        System.out.println("start...");
        
        System.out.println("ct start...");
        ct.start();
 
        System.out.println("ct join...");
        try {
			ct.join(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        System.out.println(ct.isAlive());
        ct.interrupt();
        System.out.println(ct.isAlive());
		
        System.out.println("the result is " + ct.getResult());

    }

}

class CounterThread extends Thread {
	private int time;
    public CounterThread(int time) {
    	this.time = time;
    }

    private int result;

    public int getResult() {
        return result;
    }

    public void run() {
        try {
           
            Thread.sleep(time);
            System.out.println(Thread.currentThread().getName()
                    + " is blocked for " + time + "ms");
        } catch (InterruptedException ex) {

        }
        result = 5;
    }
}


这种方式是可以的,其实还有另外一种方式,就是

public class TimeoutTest1 {

    public static void main(String[] args) {
        final ExecutorService service = Executors.newFixedThreadPool(1);

        TaskThread taskThread = new TaskThread();

        System.out.println("提交任务...begin");
       
        Future<Object> taskFuture = service.submit(taskThread);
        System.out.println("提交任务...end");
        try {
        	System.out.println("get .... begin");
			Object re = taskFuture.get(1000, TimeUnit.MILLISECONDS);
			System.out.println(re);
			System.out.println("get .... end");
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		} catch (TimeoutException e) {
			System.out.println("超时 取消任务");
			taskFuture.cancel(true);
			System.out.println("超时 取消任务OK");
		}finally{
			System.out.println("关闭服务");
			service.shutdown();
			System.out.println("关闭服务OK");
		}

    }

}
class TaskThread implements Callable<Object> {
	   

    public Object call() throws Exception {
    	String result = "空结果";
        try {
        	System.out.println("任务开始....");
            Thread.sleep(5000);
            result = "正确结果";
            System.out.println("任务结束....");
        } catch (Exception e) {    
            System.out.println("Task is interrupted!");
        }
        return result ;
    }

}

   
分享到:
评论
3 楼 wu_yong988 2010-11-21  
Callable 接口 果然强大,
终于解决“方法超时处理”的问题了。
2 楼 zhidde 2010-09-26  
zhidde 写道
第一种方式明显不行,只是由于在子线程中恰好调用了sleep方法,所以调用interrupt方法可以中断子线程。
第二种方式可行。
谢谢

又试了试,两种方式都一样,当线程不处于阻塞状态,想中断一个线程就成了不可能的事
1 楼 zhidde 2010-09-26  
第一种方式明显不行,只是由于在子线程中恰好调用了sleep方法,所以调用interrupt方法可以中断子线程。
第二种方式可行。
谢谢

相关推荐

    Java线程超时监控

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

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

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

    Java实现任务超时处理方法

    Java实现任务超时处理方法 Java实现任务超时处理方法是指在Java中对超时任务的处理,主要有两种方式:基于异步任务结果的超时获取和使用延时任务来终止超时操作。 基于异步任务结果的超时获取是通过使用Future对象...

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

    本文将深入探讨如何使用Java的线程机制来实现程序执行的超时控制,同时也会涉及基本数据类型、反射以及它们在超时控制中的应用。 首先,我们要理解Java中的线程。线程是程序的执行单元,每个线程都有自己的执行路径...

    JAVA用户登录超时过滤器和文件配置

    综上所述,这个示例展示了如何在Java Web应用程序中实现一个用户登录超时过滤器,并通过`web.xml`配置文件进行管理。过滤器通过检查会话状态来决定是否允许用户访问受保护的资源,并且可以灵活地配置登录页面和读取...

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

    除了这种方式,我们还可以利用`java.util.Timer`类和`TimerTask`来实现超时控制。`Timer`类可以调度定时任务,而`TimerTask`是执行这些任务的实体。以下是一个简单的示例: ```java Timer timer = new Timer(); ...

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

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

    java实现CMPP协议

    Java实现CMPP协议是将中国移动通信的CMPP(China Mobile Peer to Peer)协议转化为Java语言进行编程的一种技术。CMPP协议主要用于短信中心(SMSC)与短信网关之间的通信,支持大量并发的短信发送和接收操作,是移动...

    Java实现商城订单超时取消功能

    在Java中实现商城订单超时取消功能,主要是利用了JDK中的`DelayQueue`数据结构。`DelayQueue`是一个无界的阻塞队列,它仅允许存放实现了`Delayed`接口的元素,这些元素只有在到达指定延迟时间后才能被取出。这种特性...

    Java Socket 实现SMTP邮件发送,支持SSL/TSL

    7. **异常处理**:在实现SMTP邮件发送时,要处理各种可能的网络和协议错误,如连接失败、认证错误、超时等。这通常通过捕获和处理`IOException`、`AuthenticationFailedException`等异常来实现。 8. **关闭资源**:...

    java 访问网络 下载文件 爬虫 超时处理解决方案

    在IT领域,尤其是在Java编程中,访问网络、下载文件、实现爬虫功能以及处理超时问题是非常关键的技术点。本文将深入探讨如何在Java中有效处理这些方面的问题,特别是超时处理解决方案,这对于构建高效、稳定的网络...

    Java超时订单管理系统源码.zip

    Java超时订单管理系统是一款基于Java技术开发的系统,主要用于处理电商平台中的超时未支付订单,确保交易流程的高效和顺畅。这个系统的核心功能是监控订单状态,一旦发现订单超过预设的支付时间限制,就会自动进行...

    java代码实现短信猫发短信

    Java代码实现短信猫发送短信是一项常见的通信应用,主要利用了串行通信技术。短信猫,又称GSM调制解调器,是一种硬件设备,通过USB或串口与计算机连接,可以实现短信的收发功能。在Java编程环境中,我们可以利用Java...

    java swing实现考勤工时计算工具

    Java Swing 实现的考勤工时计算工具是一个基于桌面应用的程序,专为处理和计算员工的出勤时间而设计。这个工具的核心功能是接收Excel报表中的考勤数据,然后利用SQLite数据库进行存储和处理,以得出精确的工作小时...

    java定时器实现实时访问数据库以免数据库链接超时

    在Java编程中,为了保持数据库连接的活性,避免因长时间无操作导致的连接超时问题,我们可以使用定时器(Timer)来定期执行某些任务,比如心跳检测。下面将详细讲解如何利用Java定时器实现这一功能。 首先,我们...

    java实现的翻译功能

    Java作为一种广泛使用的编程语言,提供了丰富的库和框架来实现各种功能,包括文本翻译。本篇将深入探讨如何利用Java实现多语言翻译。 首先,实现翻译功能的关键在于接入翻译API。常见的翻译API有Google Translate ...

    Java实现远程桌面(参赛作品)

    在这个项目中,"Java实现远程桌面"是一个使用纯Java编程语言编写的远程桌面解决方案,它使得用户能够在一台计算机上操控另一台计算机,无论它们之间的距离有多远。下面我们将深入探讨这个项目的相关知识点: 1. **...

    cmpp2.0 java实现

    在Java环境中实现CMPP2.0协议,可以让我们更好地理解和控制短信服务的流程。 一、CMPP2.0协议简介 CMPP2.0协议是基于TCP/IP通信协议栈的,它定义了SP和SCP之间的数据交互格式和规则。协议主要包括连接建立、消息...

    springboot结合rabbitmq实现订单超时自动关闭

    至此,我们已经实现了使用Spring Boot和RabbitMQ来监控订单超时并自动关闭的功能。这个方案不仅有助于优化系统性能,还能降低系统复杂性,因为订单超时处理与主要业务流程分离,成为了一个独立的异步任务。 通过...

    如何利用Java实现QQ文件传输功能

    在Java中实现文件传输功能是一个广泛的话题,涉及到网络编程和数据传输的许多基础知识。本知识点将围绕Java网络编程中的Socket通信和文件传输的实现原理进行详细探讨。 1. Java网络编程基础 Java网络编程提供了两个...

Global site tag (gtag.js) - Google Analytics