java中Runnable与Callable的区别
下文笔者讲述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()); } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。