我们写一个有超时功能的 Callable:

import java.util.concurrent.*;

public class TimeoutCallable implements Callable {

private final Callable callable;

private final V timeoutV;

private final long timeout;

/**

* 构造一个 TimeoutCallable

*

* @param callable 要运行的 Callable

* @param timeout Callable 的最大运行时间

* @param timeoutV Callable 超时的返回结果

*/

public TimeoutCallable(Callable callable, long timeout, V timeoutV) {

this.timeout = timeout;

this.callable = callable;

this.timeoutV = timeoutV;

}

@Override

public V call() throws Exception {

ExecutorService executor = Executors.newSingleThreadExecutor();

Future future = executor.submit(callable);

V v = null;

try {

v = future.get(timeout, TimeUnit.MILLISECONDS);

} catch (TimeoutException ex) {

System.out.println("Callble 超时");

}

executor.shutdownNow(); // 给线程池中所有正在运行的线程发送 中断 信号

return v != null ? v : timeoutV;

}

}

然后试验:

import java.util.concurrent.*;

public class Test {

public static void main(String[] args) throws Exception {

Callable callable = () -> {

int N = 4;

int sum = 0;

for (int i = 0; i < N; i++) {

// Thread.sleep 方法是可以响应中断的,

// 如果你的代码需要“超时则线程结束”的效果,那么你的代码也应该要能够响应中断

Thread.sleep(1000);

sum += i;

}

return sum;

};

// 代码2, 代码2 运行的最长时间为 timeout

int timeout = 3000;

Integer timeoutValue = -1;

TimeoutCallable timeoutCallable = new TimeoutCallable<>(callable, timeout, timeoutValue);

ExecutorService executor = Executors.newSingleThreadExecutor();

Future future = executor.submit(timeoutCallable);

Integer result = future.get();

executor.shutdown();

// end 代码2

// 代码3

if (timeoutValue.equals(result)) {

System.out.println("--任务超时--");

} else {

System.out.println("任务结果:" + result);

}

// end 代码3

}

}

callable 的运行时间为 4 s,但我们设置的超时时间为 3 s,所以代码运行结果就是:

(可以看到 NetBeans 给出的运行时间是 3 s)

如果我们将 timeout 改成 5000(5 s),则结果是:

(可以看到 NetBeans 给出的运行时间是 4 s)

poj java 输入超时_Java:如何实现代码超时功能?相关推荐

  1. java 输入控制_java控制台输入

    一.java控制台输入 java控制台输入有如下几个方法 1.JDK 1.4 及以下版本读取的方法 JDK 1.4 及以下的版本中要想从控制台中输入数据只有一种办法,即使用System.in获得系统的 ...

  2. java 输入出生年月_java代码实现输入你出生年月日,计算到今天已经度过了多少天...

    输入出生年月日,计算到今天为止已经经过了多少天 import java.text.ParseException; import java.text.SimpleDateFormat; import j ...

  3. java 抓屏_java抓屏代码

    一个网上找下来的 抓屏代码只需呀输入要存放的路径和名字 就可以执行,但不能为空. import java.awt.Dimension; import java.awt.Rectangle; impor ...

  4. java输入输出流_Java学习之输入输出流

    "持志如心痛,一心在痛上,岂有功夫说闲话,管闲事 --摘自阳明先生语录" Java中通过流来完成输入/输出,所有的输入/输出以流的形式处理,流可以理解为一个数据的序列.输入流表示从 ...

  5. java 连接kafka超时_java – Kafka KStreams – 处理超时

    我试图使用< KStream> .process()与Time Windows.of("name",30000)批量处理一些KTable值并发送它们.似乎30秒超过了消 ...

  6. java基础格式_Java基础之代码的基本格式

    每一种编程语言都有一套自己的语法规范,java也是如此,同样需要遵从一定的语法规范,如代码的书写.标识符的定义.关键字的应用等.因此要学好Java就要先熟悉它的基本语法.很多人都在发知识点和课程大纲, ...

  7. java 输入人名_Java 读取控制台输入

    Java 提供了我们两种读取控制台输入的方法: 一.传统方法 public class ReadConsoleOld { public static void main(String[] args) ...

  8. java synchronized块_Java多线程同步代码块Synchronized

    Java多线程同步代码块Synchronized Java中的每个对象都有一个与之关联的内部锁(Intrinsic lock). 这种锁也称为监视器(Monitor), 这种内部锁是一种排他锁,可以保 ...

  9. java 输入地址_Java输入邮件地址

    import java.util.Scanner; public class Exercise01 { public static void main(String[] args) { System. ...

最新文章

  1. 以前不知道的,现在知道了(微机原理)
  2. javascript构造可以上传文件的form表单(通过js修改enctype)
  3. Word文档转html并提取标题
  4. 【干货】产品经理常忽略的用户研究的四大误区
  5. 10个凭证类型的速记
  6. 【机器学习】分类算法-sklearn转换器和估计器
  7. PAT (Basic Level) 1073 多选题常见计分法(恶心模拟)
  8. java反射模式_Java反射机制详解
  9. 【Codeforces Round #452 (Div. 2) C】 Dividing the numbers
  10. 1-3docker commit定制镜像
  11. Android studio的布局总结
  12. vue修改config后怎么生效_梦幻西游 金银锦盒修改后资金怎么攥 可以考虑跑商
  13. 大文件上传 之 改版了的SlickUpload.HttpUploadModule(Krystalware.SlickUpload.dll)
  14. 在win7物理机,使用vmware,3台centos7系统,分别部署httpd,php-fpm,mariadb
  15. 【教你Win7下如何激活快速启动栏】
  16. 数据结构 严蔚敏 迷宫求解 代码
  17. 一转眼,波士顿动力 Atlas 机器人又会过独木桥了!
  18. 积木Sketch插件进阶开发指南
  19. 一个故事带你看透HTTPS(上)
  20. android实现仿真键盘(KeyboardView适配)

热门文章

  1. 分区字段不在SQL过滤中,悲剧
  2. python3.3使用tkinter实现猜数字游戏代码
  3. 网站目录爆破的扫描器的思路
  4. ffmpeg文档3:播放声音
  5. AngularJS学习之旅—AngularJS 模块(十五)
  6. ArcGIS中,一个点集里的点两两连线,比如有4个点,就连6条线
  7. 学号 2016-2017-20155329《Java程序设计》课程总结
  8. Ext中Grid重新load设置URL
  9. Windows Server 2012 +WDK7600.16385.1+VS2008驱动开发环境搭建
  10. K8S_Google工作笔记0013---通过二进制方式_部署node节点_安装docker