`
raymond.chen
  • 浏览: 1419734 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用SimpleTimeLimiter类实现方法限时调用功能

 
阅读更多

使用Guava的SimpleTimeLimiter类可以实现调用方法超过指定时间后还没返回时中断调用的逻辑。

 

/**
 * 基于代理模式实现
 */
private static void test1() {
	ExecutorService executorService = Executors.newCachedThreadPool();
	TimeLimiter timeLimiter = new SimpleTimeLimiter(executorService);
	UserService userService = timeLimiter
			.newProxy(new UserServiceImpl(), UserService.class, 1500, TimeUnit.MILLISECONDS);
	
	try{
		String name = userService.getName();
		System.out.println("name=" + name);
	}catch(Exception ex){
		if(ex instanceof UncheckedTimeoutException){
			System.out.println("超时:" + ex.getMessage());
		}else{
			System.out.println(ex.toString());
		}
	}finally{
		executorService.shutdown();
	}
}

/**
 * 基于回调的方式,适合任意的单个方法使用
 */
private static void test2(){
	ExecutorService executorService = Executors.newCachedThreadPool();
	TimeLimiter timeLimiter = new SimpleTimeLimiter(executorService);
	
	try{
		timeLimiter.callWithTimeout(new Callable<String>() {
			@Override
			public String call() throws Exception {
				TimeUnit.MILLISECONDS.sleep(2000);
				return "zhang san";
			}
		}, 1000, TimeUnit.MILLISECONDS, true);
		
		System.out.println("success");
		
	}catch(Exception ex){
		if(ex instanceof UncheckedTimeoutException){
			System.out.println("超时:" + ex.getMessage());
		}else{
			System.out.println(ex.toString());
		}
	}finally{
		executorService.shutdown();
	}
}

 

public interface UserService {
	String getName() throws InterruptedException;
}

public class UserServiceImpl implements UserService {
	@Override
	public String getName() throws InterruptedException {
		TimeUnit.MILLISECONDS.sleep(2000);
		return "zhang san";
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics