java中Runnable与Callable的区别

乔欣 Java面经 发布时间:2023-02-20 23:13:34 阅读数:5893 1
下文笔者讲述Java中Runnable和Callable相同点及不同点说明,如下所示

Runnable和Callable相同点

 
两者都是interface
两者都用于编写多线程程序
两者都是使用Thread.start启动

Runnable和Callable不同点

最主要的区别:
	实现Callable接口的任务线程能返回执行结果
	实现Runnable接口的任务线程不能返回结果,这是核心区别

    Callable接口的call()方法允许抛出异常
    Runnable接口的run()方法的异常只能在内部消化,不会上抛异常;

   Runnable可以作为Thread构造器的参数,通过开启新的线程来执行,也可以通过线程池来执行
    Callable只能通过线程池执行。

Callable示例

打印求和
import java.util.Arrays;
import java.util.list;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class SumCallableImpl implements Callable<Long> {
   private final long from;
   private final long to;

   SumCallableImpl(long from, long to) {
       this.from = from;
       this.to = to;
   }

   @Override
   public Long call() {
       long acc = 0;
       for (long i = from; i <= to; i++) {
           acc = acc + i;
       }
       System.out.println(Thread.currentThread().getName() + " : " + acc);
       return acc;
   }

   public static void main(String[] args) throws Exception {
       ExecutorService executor = Executors.newFixedThreadPool(3);
       List<Future<Long>> results = executor.invokeAll(Arrays.asList(
               new SumCallableImpl(0, 10), new SumCallableImpl(0, 1_000), new SumCallableImpl(0, 1_000_000)
       ));
       executor.shutdown();
       System.out.println("打印执行结果:");
       for (Future<Long> result : results) {
           System.out.println(result.get());
       }
   }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaMianJing/202302/16769060425859.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者