zoukankan      html  css  js  c++  java
  • 使用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

     

  • 相关阅读:
    JSP根据身份证号码计算生日
    JSP听课笔记(二)
    JSP听课笔记(一)
    JDBC连接数据库过程(转载)
    PL/SQL
    阅读笔记
    javaScript的一些奇妙动画
    原型与原型链之间一些奥秘
    CSS3 @keyframes 规则
    Java语言中的基本词汇
  • 原文地址:https://www.cnblogs.com/silenceshining/p/11123496.html
Copyright © 2011-2022 走看看