为线程执行设置timeout

标签: 线程 timeout | 发表时间:2012-12-25 17:32 | 作者:
出处:http://www.iteye.com
package com.test.threads;

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 Hawkins
 *
 *
 *在指定时间内执行某个task,超时则退出执行。
 */
public class TimedCall {
	public static void main(String[] args) throws InterruptedException,
			ExecutionException, TimeoutException {
		long timeout = 1000;// 任务必须在设定时间内完成,否则任务将被强制关闭
		long timeNeed = 2000;// 任务完成需要的时长。
		TimeUnit timeUnit = TimeUnit.MILLISECONDS;// 时间单位
		ExecutorService executor = Executors.newSingleThreadExecutor();// 高级并发API

		Runnable task = new MyThread(timeNeed, timeUnit);

		while (!timedCall(executor, task, timeout, timeUnit))
			;// 在某些场景下,需要不断尝试执行任务,直到能够在限定时间内执行完毕。

	}

	private static boolean timedCall(ExecutorService executor, Runnable c,
			long timeout, TimeUnit timeUnit) throws InterruptedException,
			ExecutionException {
		// FutureTask<?> task = new FutureTask<Object>(c, null);
		// executor.execute(task);
		//		
		// task.get(timeout, timeUnit);
		Future<?> future = executor.submit(c);
		try {
			future.get(timeout, timeUnit);
			return true;
		} catch (TimeoutException e) {
			future.cancel(true);// 参数设为true,向执行线程发送中断通知。否则,允许已经启动的线程继续执行直到完成任务。
			System.err.println("任务执行超时,强制退出");
			return false;
		}
	}
}

class MyThread implements Runnable {
	long timeLong = 0;// how long thread running will cost
	TimeUnit timeUnit;

	public MyThread() {
	}

	public MyThread(long milli, TimeUnit timeUnit) {
		this.timeLong = milli;
		this.timeUnit = timeUnit;
	}

	@Override
	public void run() {
		System.out.println("---------" + Thread.currentThread().getName()
				+ "开始执行,时长[" + timeLong + "]------");
		try {
			Thread.sleep(timeLong);
		} catch (InterruptedException e) {
			System.err.println("线程中断,退出");
			return;// 必须响应中断,否则无法退出线程。在退出之前你可能还需做一些资源回收等等。
		}
		System.out.println("---------" + Thread.currentThread().getName()
				+ "执行完毕,时长[" + timeLong + "]------");

	}
}


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [线程 timeout] 推荐:

为线程执行设置timeout

- - ITeye博客
long timeout = 1000;// 任务必须在设定时间内完成,否则任务将被强制关闭. long timeNeed = 2000;// 任务完成需要的时长. TimeUnit timeUnit = TimeUnit.MILLISECONDS;// 时间单位. ExecutorService executor = Executors.newSingleThreadExecutor();// 高级并发API.

Dubbo之connet timeout问题排查

- - 开源软件 - ITeye博客
    购物车依赖推荐的dubbo接口,推荐服务每天凌晨3点会批量下线推荐dubbo服务,全量更新商品,更新完以后在执行上线操作,每天凌晨3点10分左右,购物车工程都会出现5000左右的connection timeout error. 正常依赖的dubbo服务工程在启动的时候,消费端会经常出现connection timeout error.

c_socket.io_server笔记之长轮询超时(timeout)处理

- - BlogJava-首页技术区
当你习惯了现有WEB服务器,诸如nginx、apache,JAVA应用服务器Tomcat等,你就不能不注意HTTP请求的响应超时时间,需要小心,尤其是反向代理时. 当你可以自由控制请求timeout超时时,那是怎样一个快意. 在libev中使用timeout,没有像java那样封装的完善,一切都很原始,但确实锋利多了.

apache ab 性能测试 timeout 解决方案

- - 互联网 - ITeye博客
  源:http://blog.csdn.net/garn_hsia/article/details/12997477. 使用ab或者webbench做压力测试,如果并发数开到1000的时候,无法完成测试. 到晚上查看资料发现是linux网络参数设置. 在kernel2.6之前的添加项:. kernel2.6之后的添加项:.

MySQL timeout相关参数解析和测试

- - cenalulu's Tech Blog
MySQL中有两个关于连接超时的配置项:. wait_timeout和 interactive_timeout. 他们之间在某些条件下会互相继承,那究竟这两个参数会在什么情况下起作用呢. 本文将会通过一些测试实例来证明总结两者的相互关系. Before MySQL 5.1.41, this timeout applies only to TCP/IP connections, not to connections made through Unix socket files, named pipes, or shared memory.

spring-cloud服务网关中的Timeout设置

- - ImportNew
大家在初次使用spring-cloud的gateway的时候,肯定会被里面各种的Timeout搞得晕头转向. hytrix有设置,ribbon也有. 我们一开始也是乱设一桶,Github上各种项目里也没几个设置正确的. 对Timeout的研究源于一次log中的warning. The Hystrix timeout of 60000 ms for the command “foo” is set lower than the combination of the Ribbon read and connect timeout, 200000ms..

MySQL Replication 线程

- - CSDN博客推荐文章
Replication 线程. Mysql 的Replication 是一个异步的复制过程,从一个Mysql instace(我们称之为Master)复制到另一个Mysql instance(我们称之Slave). 在Master 与Slave 之间的实现整个复制过程主. 要由三个线程来完成,其中两个线程(Sql 线程和IO 线程)在Slave 端,另外一个线程(IO 线程)在Master 端.

Java线程池

- - 企业架构 - ITeye博客
线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的. 在jdk1.5之后这一情况有了很大的改观. Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用. 为我们在开发中处理线程的问题提供了非常大的帮助.

Java 线程池

- - 编程语言 - ITeye博客
在项目中,系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互. 在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存周期很短的线程时,更应该考虑使用线程池. 使用线程池可以有效地控制系统中并发线程的数量,当系统中包含大量并发线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃,而线程池的最大线程数参数可以控制系统中并发线程数不超过此数.

Java线程(四):线程中断、线程让步、线程睡眠、线程合并

- - 编程语言 - ITeye博客
 最近在Review线程专栏,修改了诸多之前描述不够严谨的地方,凡是带有Review标记的文章都是修改过了. 本篇文章是插进来的,因为原来没有写,现在来看传统线程描述的不太完整,所以就补上了. 理解了线程同步和线程通信之后,再来看本文的知识点就会简单的多了,本文是做为传统线程知识点的一个补充. 有人会问:JDK5之后有了更完善的处理多线程问题的类(并发包),我们还需要去了解传统线程吗.