Where to use callable and where to use Runnable Interface?
我对Java很陌生,我正在经历多线程的概念,在经历使用多线程的各种实现时,我经历了这两个概念。Java问题中的可运行接口和可调用接口之间的区别指定了两者之间的区别和使用的地方。
我的疑问是,如果Callable能够做所有可运行的事情,为什么那么多人使用Runnable而不是Callable?与可运行的接口相比,在实现可调用接口方面是否有额外的开销?
在EDCOX1的6个包(在Java 5版本中登陆)之前,没有其他选择来进行并发计算,而是直接操作EDCOX1×7秒。
您可以直接操作线程,例如通过子类化:
1 2 3 4 5 |
或者您也可以通过创建一个
1 2 3 4 5 6 |
但无论您使用哪种方式,您都必须在线程上创建、启动、操作和联接。有哪些缺点:您可以创建多少线程?这个贵吗?(在某种程度上,它是这样的,尽管它随着每个JVM实现变得越来越便宜。)
另外,这个API本身也有开发人员必须克服的局限性:如果我想从
进入
您希望为多个"工作单元"重用线程(它是
用
My doubt is if Callable is capable of doing everything that Runnable, why so many people use Runnable instead of callable?
也许他们有旧代码(Java 1.4?)可能他们不知道高级抽象的好处,更喜欢低级的
一般来说,由于出现了并发API,因此没有理由更喜欢使用
Are there any extra overheads in implementing Callable interface in comparison with Runnable Interface?
在"实施
所以,是的,并发API有它的成本,但是在任何标准用例中,它都是绝对的,完全可以忽略的,但是它也有新的优势,使得它在许多方面变得更好,包括性能。
另外,您已经从API中获得了大量新的可能性,如已经说明的(参见Foo/Join框架,参见Java 8中的并行流,…),并且减少了对所述功能的任何"自定义"、"自制"并发代码的需求,这是众所周知的很难得到的。
收益/成本比完全有利于"新的"并发API。
My doubt is if Callable is capable of doing everything that Runnable, why so many people use Runnable instead of callable? Are there any extra overheads in implementing Callable interface in comparison with Runnable Inteface?
与文档页面的关键区别
The
Callable interface is similar toRunnable , in that both are designed for classes whose instances are potentially executed by another thread. ARunnable , however, does not return a result and cannot throw a checked exception.
让我们检查abstractExecutorService的源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture<Object> ftask = newTaskFor(task, null); execute(ftask); return ftask; } public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task); execute(ftask); return ftask; } |
我看不到执行
一个重要区别是:
通过创建一个私有数据成员并提供getter,您可以对
My doubt is if Callable is capable of doing everything that Runnable, why so many people use Runnable instead of callable?
这个问题就等于问:"为什么Java有静态类型?"接口是编译时类型签名的声明,不多也不少;任何两个接口之间的唯一区别是参数的编译时类型和返回值。
那么Java为什么有静态类型呢?不幸的是,这个问题超出了stackoverflow的范围。您可以使用Google查找所有关于静态类型语言和动态类型语言的信息。
另外,如果你想了解一个不同的世界,你可以尝试写一些Ruby代码。Ruby中没有接口,因为没有静态类型。Ruby程序员谈论"duck-typing",这是谷歌的另一个好短语。
why so many people use Runnable instead of callable?
在JDK中,可调用性是一种新的竞争性工具,它与执行器框架一起提供了更大的线程执行灵活性。
Are there any extra overheads in implementing Callable interface in
comparison with Runnable Inteface?
我不这么认为,如果您遵循任何标准的执行者文档,这是非常直接的。