zoukankan      html  css  js  c++  java
  • Callable 和 Future接口 学习

    * Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

    * Callable和Runnable有几点不同:

    * (1)Callable规定的方法是call(),而Runnable规定的方法是run().

    * (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。

    * (3)call()方法可抛出异常,而run()方法是不能抛出异常的。

    * (4)运行Callable任务可拿到一个Future对象,

    * Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。

    * 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。

    例子:

    public class TimeOut {  
        public static void main(String[] args){  
            int timeout = 2; //秒.  
            ExecutorService executor = Executors.newSingleThreadExecutor();  
            Boolean result = false;     
            Future<Boolean> future = executor.submit(new MyJob("请求参数=="));// 将任务提交到线程池中     
            try {     
                result = future.get(timeout*10000, TimeUnit.MILLISECONDS);// 设定在200毫秒的时间内完成   
                System.out.println(result);  
            } catch (InterruptedException e) {  
                System.out.println("线程中断出错。");  
                future.cancel(true);// 中断执行此任务的线程     
            } catch (ExecutionException e) {     
                System.out.println("线程服务出错。");  
                future.cancel(true);// 中断执行此任务的线程     
            } catch (TimeoutException e) {// 超时异常     
                System.out.println("超时。");     
                future.cancel(true);// 中断执行此任务的线程     
            }finally{  
                System.out.println("线程服务关闭。");  
                executor.shutdown();  
            }  
        }  
          
        static class MyJob implements Callable<Boolean> {    
            private String t;  
            public MyJob(String temp){  
                this.t= temp;  
            }  
            public Boolean call() {  
                //调整i大小测试超时
                for(int i=0;i<999999999;i++){  
                    if(i==2){  
                        System.out.println(t);  
                    }  
                    if (Thread.interrupted()){ //很重要  
                        return false;     
                    }  
                }   
                System.out.println("继续执行..........");     
                return true;     
            }     
        }   
    } 
     
     public class TimeoutTest1 {
    
        public static void main(String[] args) {
            final ExecutorService service = Executors.newFixedThreadPool(1);
            TaskThread taskThread = new TaskThread();
            System.out.println("提交任务...begin");
            Future<Object> taskFuture = service.submit(taskThread);
            System.out.println("提交任务...end");
            try {
                Object re = taskFuture.get(6000, TimeUnit.MILLISECONDS);// 超时设置,6s
                System.out.println(re);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                System.out.println("超时 取消任务");
                taskFuture.cancel(true);
                System.out.println("超时 取消任务OK");
            } finally {
                service.shutdown();
            }
        }
    }
    
    class TaskThread implements Callable<Object> {
        public Object call() throws Exception {
            String result = "空结果";
            try {
                System.out.println("任务开始....");
                //修改sleep 的值测试超时
                Thread.sleep(500);
                result = "正确结果";
                System.out.println("任务结束....");
            } catch (Exception e) {
                System.out.println("Task is interrupted!");
            }
            return result;
        }
    }
  • 相关阅读:
    Random生成随机数
    Jmeter(八)Jmeter监控tomcat
    Jmeter(七)Mongodb的增删改查
    Jmeter(六)文件上传和下载文件
    Jmeter(五)mysql的增删改查
    Jmeter(四)测试webservice脚本
    Jmeter(三)断言和关联
    Jmeter(二)参数化
    Jmeter(一)http接口添加header和cookie
    Python学习笔记(一)数据类型
  • 原文地址:https://www.cnblogs.com/sprinng/p/5849710.html
Copyright © 2011-2022 走看看