• 使用Callable、Future以及FutureTask进行线程操作


    Future接口代表异步计算的结果,并且提供方法来检测异步过程的进展。Callable接口与Runnable接口比较类似,提供线程的执行体,即run方法的内容。

    Future与Callable结合使用开启一个新线程执行,最大的特点是能提供返回值,这样也就能实现类似同步执行的情况,看以下示例,在新线程中模拟5s的耗时操作,使用future.get将阻塞等待返回结果。

    package demo.thread;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    
    public class CallableDemo {
        public static void main(String[] args) throws InterruptedException,
                ExecutionException {
            ExecutorService executorService = Executors.newCachedThreadPool();
            Future<String> future = executorService.submit(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    Thread.sleep(5000);
                    return "future result";
                }
            });
            System.out.println(System.currentTimeMillis());
            System.out.println(future.get());
            System.out.println(System.currentTimeMillis());
        }
    
    }

    执行结果如下:

    1562077654406
    future result
    1562077659407

    FutureTask间接实现了Runnable和Future接口,同样可以实现上述功能,如下:

    package demo.thread;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    
    public class FutureTaskDemo {
    
        public static void main(String[] args) throws InterruptedException,
                ExecutionException {
            FutureTask<String> futureTask = new FutureTask<String>(
                    new Callable<String>() {
    
                        @Override
                        public String call() throws Exception {
                            Thread.sleep(5000);
                            return "future result";
                        }
                    });
            new Thread(futureTask).start();
            System.out.println(System.currentTimeMillis());
            System.out.println(futureTask.get());
            System.out.println(System.currentTimeMillis());
    
        }
    
    }

    执行结果如下:

    1562077797983
    future result
    1562077802985

     

  • 相关阅读:
    java的一些基本概念──JDK 、j2se 、j2sdk...
    shell函数的调用执行
    ICE第三方包简介及安装&ICE安装(linux)
    http状态码
    Grep命令学习笔记(转)
    STL map用法详解
    ubuntu下安装subversion客户端
    linux下安装Tomcat及设置JSP环境
    ICE总结
    struts开发
  • 原文地址:https://www.cnblogs.com/silenceshining/p/11123496.html
Copyright © 2020-2023  润新知