Java8 ——多线程(一):Future

Java中,我们可以通过多线程,完成一些可以并发执行的任务,提高CPU利用率,减少总运行时间。

Runnable & Callable

线程是一种典型的异步模型,即无需等待线程执行完,继续向下执行程序,因此我们往往通过异步执行多线程来节省时间。

一般在并发编程时,我们通过实现Runnable接口,定义一个线程类,然后开启线程,交由线程池去执行即可,无需知道线程执行的结果,即无返回值,因此Runnable接口中的run方法是void类型。

public static void main(String[] args){
  Runnable myThread = () -> {
    System.out.println("runnable !");
  };
}

但是,在有些情况下,我们需要获取异步执行的结果,对它进行一些操作,通过上面的方式显然是无法做到的,因此,有了Callable。

callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以任意指定。

public static void main(String[] args){
  Callable myThread = () -> {
    System.out.println("callable !");
    return 1;
  };
}

通过Callable接口,可以让让线程返回一个结果,那么如何获取它呢,答案是Future!

Future表示一个可能还没有完成的异步任务的结果,我们可以通过Future,获取异步执行的结果,甚至是对异步线程做一些简单操作。

Future常用方法

V get():通过此方法,可以获取到异步线程的执行结果,如果异步线程未执行完成,会阻塞当前线程进行等待
V get(long timeout, TimeUnit unit):为了防止无休止的阻塞等待异步结果,设定一个超时时间,后面的TimeUnit代表的应该是超时时间的单位,例如TimeUnit.SECOND,秒。

//开启了一个异步线程,返回值为 Future<Integer> result;
Future<Integer> result = ....;
//主线程可以继续执行部分代码
。。。。
//阻塞,获取异步执行结果
Integer a = result.get();
//在超时时间内阻塞,获取异步执行结果
Integer b = result.get(2, TimeUnit.SECOND);

boolean isDone():获取异步线程是否执行完

result.isDone();

boolean cancel(boolean mayInterrupIfRunning):取消异步线程,参数表示 如果线程正在执行,是否仍然取消。注意:线程停止后,无法再次开启
boolean isCancelled(): 顾名思义,判断是否异步线程是否取消

result.isCancelled();  // false
result.cancel(true);   //即使线程已经开始执行了,也取消
result.isCancelled();  //true
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值