<< Word Break II -- LeetCode - Code Ganker - 博客频道 - CSDN.NET | 首页 | rank/ITEYEBlogSimilarChecker.java at master · ysc/rank · GitHub >>

java多线程实现任务超时监听 - huangying2124的专栏 - 博客频道 - CSDN.NET

使用Future的特性(推荐)

利用Future.get(long timeout,   TimeUnit unit)方法。

1、新建TaskThread类,实现Callable接口,实现call()方法。

2、线程池调用submit()方法,得到Future对象。

3、调用Future对象的get(long timeout,   TimeUnit unit)方法,该方法的特点:阻塞式线程调用,同时指定了超时时间timeout,get方法执行超时会抛出timeout异常,该异常需要捕获。

 

示例代码:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. public class TimeTask implements Callable<String> {  
  2.   
  3.     @Override  
  4.     public String call() throws Exception {  
  5.         //执行任务主体,简单示例  
  6.         Thread.sleep(1000);  
  7.         return "hehe";  
  8.     }  
  9.   
  10. }  

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1.               ExecutorService exec = Executors.newCachedThreadPool();  
  2. Future<String> f = exec.submit(new TimeTask());  
  3. try {  
  4.     f.get(200, TimeUnit.MILLISECONDS);  
  5. catch (InterruptedException e) {  
  6.     e.printStackTrace();  
  7. catch (ExecutionException e) {  
  8.     e.printStackTrace();  
  9. catch (TimeoutException e) {  
  10.     //定义超时后的状态修改  
  11.     System.out.println("thread time out");  
  12.     e.printStackTrace();  
  13. }  
  14.  

 

Google Guava已经提供了TimeLimiter的功能,实现更精巧,功能更强大,可参考:

  1. import com.google.common.util.concurrent.SimpleTimeLimiter;  
  2.   
  3. public class TimeLimiterGoogle {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      * @throws Exception  
  8.      */  
  9.     public static void main(String[] args) throws Exception {  
  10.         // TODO Auto-generated method stub  
  11.         SimpleTimeLimiter st = new SimpleTimeLimiter();  
  12.         String r1 = st.callWithTimeout(new Callable<String>(){  
  13.   
  14.             @Override  
  15.             public String call() throws Exception {  
  16.                 return "Hello";  
  17.             }}, 10, TimeUnit.MILLISECONDS, true);  
  18.         System.out.println(r1);  
  19.           
  20.         String r2 = st.callWithTimeout(new Callable<String>(){  
  21.   
  22.             @Override  
  23.             public String call() throws Exception {  
  24.                 Thread.sleep(1000);  
  25.                 return "Hello";  
  26.             }}, 10, TimeUnit.MILLISECONDS, true);  
  27.         System.out.println(r2);   
  28.     }  
  29.   
  30. }  

阅读全文……

标签 : ,



发表评论 发送引用通报