Java:Runnable和Callable<V>以及FutureTask

本文探讨Java中Runnable和Callable的区别以及FutureTask的使用。Runnable无返回值,而Callable能抛出异常并有返回值。FutureTask作为中介,使Thread能够执行Callable任务并获取结果。通过线程池或直接使用Thread执行FutureTask,实现异步计算并获取结果。
摘要由CSDN通过智能技术生成

一、两者的使用区别

Runnable

实现Runnable的run方法,无返回值,无法抛出异常

class RunnableTest implements Runnable {
   
    @Override
    public void run() {
   
        System.out.println("我是Runnable");
    }
}

使用

  • 直接通过Thread来调用
Thread thread = new Thread(new RunnableTest(), "线程");
thread.start();
// 我是Runnable
  • 通过线程池来调用
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(new RunnableTest());
executorService.shutdown();

Callable<V>

实现Callable的call方法,有返回值,可以抛出异常

class CallableTest implements Callable<String> {
   
    @Override
    public String call() throws Exception {
   
        TimeUnit.SECONDS.sleep(10);
        return "我是Callable,我睡眠了10s";
    }
}

使用

  • 通过FutureTask来执行
CallableTest callableTest = new CallableTest();
// 通过FutureTask来包装callable对象,并且封装callable对象执行的返回值
FutureTask<String> futureTask = new FutureTask<>(callableTest);
// 不通过线程执行,拿不到下面的执行结果
new Thread(futureTask).start();
// 通过futureTask.get()来获取线程的执行结果,get()方法会阻塞主线程
System.out.println(futureTask.get());
// 我是Callable,我睡眠了10s

注:需通过Thread来执行FutureTask,不通过Thread来执行拿不到结果

讲到这里,插嘴回顾一下,之前我们创建线程要么是通过继承Thread,要么是调用Runnable对象,Thread无法直接调用Callable&#

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值