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

     

  • 相关阅读:
    解决U3D4.1.5或以上无法启动MONODEV的方法
    unity的List构造函数在IOS平台存在缺陷
    【Python爬虫】性能提升
    【JavaScript+jQuery】JavaScript权威指南读书笔记1
    【Python爬虫】爬虫的基本修养
    【Python基础】Python yield 用法
    【Python进阶】回调函数
    【Python基础】Python输出终端的颜色显示
    【python进阶】并发编程-线程进程协程
    【项目实战开发】密码加密处理后登录验证
  • 原文地址:https://www.cnblogs.com/silenceshining/p/11123496.html
Copyright © 2011-2022 走看看