`
lydawen
  • 浏览: 472233 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

控制程序运行时间或外部接口调用超时时间

    博客分类:
  • java
 
阅读更多

 

 

  经常在运行一个新线程或调用第三方接口时存在一个问题,即线程在预计的时间内没有成功结束而导致程序失控。调用第三方系统,因为网络超时或对方响应速度异常导致己方系统异常的问题在开发中时常遇到。通过下面代码旨在解决类似问题。需要注意的时,虽然返回了,但实际那个线程还是在运行的。

 

 

 

 

import java.util.Calendar;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;


public class TestCallable {

	private static ExecutorService executor=Executors.newCachedThreadPool(new ThreadFactory() {
		int ncount=0;
		@Override
		public Thread newThread(Runnable r) {
			ncount++;
			Thread invokeThread=new Thread(r);
			invokeThread.setName("Invoker-thread-"+ncount);
			invokeThread.setDaemon(true);
			return invokeThread;
		}
	});
	
	public static void callSth(Runnable task,TimeUnit unit,long timeout)throws Exception{
		Future<?> futureResult=executor.submit(task);
		futureResult.get(timeout, unit);
	}
	
	public static void main(String[] args) {
		
		System.out.println(1<<2);
		
		Runnable rb=new Runnable() {
			@Override
			public void run() {
				TestCallable tc=new TestCallable();
				tc.dosth();//模拟调用外部接口
			}
		};
		//5秒超时
		try {
			long s=Calendar.getInstance().getTimeInMillis();
			callSth(rb,TimeUnit.MILLISECONDS,5000);
			System.out.println("运行时间:"+(Calendar.getInstance().getTimeInMillis()-s));
		} catch (Exception e) {//抓这两个异常更准确,纯粹模拟为省事就抓老大了。InterruptedException, TimeoutException 
			System.err.println("调用外部接口超时了!");
		}
		//模拟2秒超时
		try {
			callSth(rb,TimeUnit.MILLISECONDS,2000);
		} catch (Exception e) {//抓这两个异常更准确,纯粹模拟为省事就抓老大了。InterruptedException, TimeoutException 
			System.err.println("调用外部接口超时了!");
		}
	}
	
	public void dosth(){//模拟外部接口
		try {
			System.out.println("开始睡觉");
			Thread.sleep(2500);
			System.out.println("睡醒了");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
 
 

 

 

 

 

 

 

分享到:
评论

相关推荐

    API运行等待程序.rar

    在IT领域,API(Application Programming Interface)是一种接口,允许软件应用程序之间进行交互和数据...在实际项目中,这样的程序可以帮助开发者更好地控制程序流程,避免因为API调用导致的程序卡死或无响应问题。

    模拟量和PID控制

    OB1 默认扫描监控时间为 150ms(可设置),扫描超时,CPU 自动调用 B80 报错,如果程序中没有建立 OB80,CPU 进入停止模式。 二、日期中断组织块 OB10~OB17 日期中断组织块 OB10~OB17 触发的日期、执行模式(到达...

    微信小程序DEMO 源码程序

    微信小程序是一种轻量级的应用开发平台,主要用于在微信内创建和运行无需下载安装的应用。这个压缩包中的"微信小程序DEMO 源码程序"是一个非常实用的学习资源,适合初学者了解微信小程序的架构和开发流程。下面我们...

    stm32 ds1307驱动程序

    2. **初始化**:在驱动程序中,首先要对DS1307进行初始化,包括设置时钟源(通常为内部振荡器或外部晶体振荡器),设置寄存器以启用I2C通信,以及设置所需的控制位,如电源备份控制。 3. **读写操作**:DS1307的...

    31如何应对接口级的故障?.pdf

    【接口级故障】是指在系统运行中,尽管系统本身没有崩溃或网络没有中断,但业务仍然出现问题,如响应缓慢、访问超时、异常提示等。这些问题通常源于系统压力过大、负载过高,导致无法及时处理业务请求。接口级故障的...

    万利STM3210B-LK1 实验6 独立看门狗实验

    3. 喂狗:在程序的循环或关键点调用`HAL_IWDG_Refresh()`喂狗,防止超时。 4. 处理复位:当看门狗超时触发复位后,程序会重新开始执行,此时需要检查复位原因,并对IWDG进行适当的处理。 实验过程中,可以利用串口...

    单片机通过SPI外扩FLASH程序代码

    SPI(Serial Peripheral Interface)是一种常见的串行通信接口,广泛用于微控制器(MCU,即单片机)与各种外围设备之间进行数据交换,包括外扩存储器如FLASH。本主题聚焦于如何使用SPI协议在单片机上实现对外部FLASH...

    DS3231程序 stm32f051

    标题中的“DS3231程序 stm32f051”指的是一个使用STM32F051微控制器与DS...综上所述,这个程序的使用涵盖了嵌入式系统设计中的硬件接口、通信协议、时间管理等多个方面,是学习STM32与外部RTC交互的一个良好实践案例。

    易语言API运行等待程序源码-易语言

    通过学习和理解这样的源码,开发者可以掌握如何在易语言中控制外部程序的运行,这对于开发系统工具、自动化脚本等具有很大的帮助。此外,了解API调用也有助于提升对底层操作系统工作的理解,增强编程能力。 在实际...

    ucos.rar_ucos控制流水灯

    《基于UCOS的流水灯控制程序详解》 在嵌入式系统开发中,UCOS(uC/OS)是一款广泛应用的实时操作系统(RTOS),它以其高效、小巧且可移植性强的特点,深受工程师们的喜爱。本例程是关于如何在UCOS操作系统上实现...

    bcm47xx_wdt.rar_broadcom

    3. 配置:通过系统调用或设备文件(通常是`/dev/watchdog`或`/dev/bcm47xx_wdt`)设置超时时间和其它参数。 4. 监控:应用程序可以通过定期写入设备文件来“喂狗”,防止看门狗超时触发复位。 总的来说,"bcm47xx_...

    TTY终端仿真程序

    4. 设置超时参数,可以使用SetCommTimeouts函数来控制读写操作的等待时间。 5. 开始数据传输,使用ReadFile和WriteFile函数来读取和写入串行口。 在视图中显示接收到的字符,通常需要一个循环来不断读取串行口的...

    commons exec 源码

    Apache Commons Exec 是一个Java库,它提供了一个简单且强大的接口来执行外部进程。这个库的主要目的是弥补Java标准库`java.lang.ProcessBuilder`和`java.lang.Runtime.exec()`在处理外部命令时的一些不足,尤其是在...

    Clock Operation.zip

    3. **系统调用和中断处理**:时钟操作通常涉及到系统调用,比如`gettimeofday`或`clock_gettime`,这些调用允许用户空间程序获取当前时间。此外,硬件时钟产生的中断(如定时器中断)会触发处理器执行中断处理程序,...

    stm32f407 微机实验

    `HAL_UART_Transmit`函数用于通过UART接口发送数据,其参数包括UART句柄、指向发送数据的指针、发送数据的长度以及等待超时时间。 #### 实验五:看门狗(IWDG) 看门狗是一种硬件机制,用于监控系统的运行状态。当...

    STM32_DS1302

    5. **库代码结构**:库代码通常包含初始化函数(配置STM32的SPI接口和DS1302的复位线)、读写函数(用于读写DS1302的寄存器或时间数据)、设置时间函数(将用户提供的时间信息写入DS1302)和获取时间函数(从DS1302...

    Windows 系统错误代码简单分析

     0117 该应用程序所运行的 IOCTL 调用不正确。  0118 校验写入的开关参数值不正确。  0119 系统不支持所请求的命令。  0120 该系统上不支持此功能。  0121 标记已超时。  0123 文件名、目录名或卷标...

    DS18B20测试程序

    8. **异常处理**:在程序设计中,应考虑错误处理机制,如超时重试、校验错误等,以增强程序的健壮性。 9. **代码注释**:描述中提到的“有详细注释”,意味着这个测试程序对关键步骤和函数做了清晰解释,便于理解和...

    华芯微特SWM32SRET6 I2C驱动程序【支持SWM32S系列单片机】

    该驱动程序由华芯微特提供,确保了与SWM32S系列的兼容性,使开发者可以轻松地通过单片机的I2C接口与外部设备进行数据交互。驱动程序通常包含了初始化、发送数据、接收数据、读写寄存器等基本操作,以及错误处理机制...

    java开源包1

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

Global site tag (gtag.js) - Google Analytics