zoukankan      html  css  js  c++  java
  • Java多线程之FutureTask的使用与理解

    FutureTask的类图

    从FutureTask的类图中可以看出,FutureTask实现了Runnable接口和Future接口,所以它兼备Runnable和Future两种特性,下面先来看看如何使用FutureTask来启动一个新的线程:

     1 public class FutureTaskDemo {
     2     public static void main(String[] args) {
     3         ACallAble aCallAble = new ACallAble();
     4         FutureTask futureTask = new FutureTask(aCallAble);
     5         Thread thread = new Thread(futureTask);
     6         thread.start();
     7         do {
     8 
     9         }while (!futureTask.isDone());
    10         try {
    11             Object result = futureTask.get();
    12             System.out.println("Result:"+result);
    13         } catch (InterruptedException e) {
    14             e.printStackTrace();
    15         } catch (ExecutionException e) {
    16             e.printStackTrace();
    17         }
    18     }
    19 
    20 }
    21 class ACallAble implements Callable{
    22 
    23     @Override
    24     public Object call() throws Exception {
    25         Thread.sleep(1000);
    26         return "Thread-Name:"+Thread.currentThread().getName();
    27     }
    28 }

      可以看到,使用FutureTask来启动一个线程之后,我们可以监控这个线程是否完成,上面的示例中主线程会一直等待这个新创建的线程直到它返回,其实只要是Future提供的接口,我们在FutureTask中都可以使用,这极大的方便了我们,Future在并发编程中的意义极为重要,Future代表一个未来会发生的东西,它是一种暗示,一种占位符,它示意我们它可能不会立即得到结果,因为它的任务还在运行,但是我们可以得到一个对这个线程的监控对象。

      我们可以对线程的执行做一些判断,甚至是控制,比如,如果我们觉得我们等了太久,并且我们觉得没有必要再等待下去的时候,就可以将这个Task取消,还有一点需要提到的是,Future代表它可能正在运行,也可能已经返回,当然Future更多的暗示你可以在等待这个结果的同时可以使用其他的线程做一些其他的事情,当你真的需要这个结果的时候再来获取就可以了,这就是并发,理解这一点非常重要。

  • 相关阅读:
    一段路
    memcache 键名的命名规则以及和memcached的区别
    浏览器解释网页时乱码
    windows下安装Apache
    巧用PHP数组函数
    程序返回值的数据结构
    Linux如何生成列表
    判断用户密码是否在警告期内(学习练习)
    判断用户的用户名和其基本组的组名是否一致
    sed笔记
  • 原文地址:https://www.cnblogs.com/wk-missQ1/p/12895516.html
Copyright © 2011-2022 走看看