java – 在哪里使用可调用以及在哪里使用Runnable接口?

前端之家收集整理的这篇文章主要介绍了java – 在哪里使用可调用以及在哪里使用Runnable接口?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是 Java的新手,我正在阅读多线程的概念,在进行多线程的各种实现时,我经历了这两个概念.
这个 The difference between the Runnable and Callable interfaces in Java问题指出了两者之间的区别以及使用的位置.

我怀疑Callable是否能够完成Runnable的所有功能,为什么这么多人使用Runnable而不是可调用
与Runnable Inteface相比,实现Callable接口是否有额外的开销?

解决方法

在Java 5发行版中存在java.util.concurrent包之前,实际上没有其他选项可以进行并发计算,而是直接操作Threads.

你可以直接操纵线程,例如通过子类化:

public class MyThread extends Thread {
    public void run() {
        myComputation();
    }
}

或者你可以通过创建一个Runnable来做同样的事情,这是首选方式(主要是因为你不需要子类化任何东西,它提供了明确的关注点分离,更好的代码重用或一般来说,更好的组合):

public class MyRunnable implements Runnable {
    public void run() {
        mycomputation();
    }
}
new Thread(new MyRunnable()).start();

但无论您使用哪种方式,都必须创建,启动,操作,加入线程.哪个有缺点:你可以创建多少个线程?这个贵吗? (在某些时候,它是,尽管每个JVM实现变得更便宜和更便宜.)

此外,这个API本身也有开发人员必须克服的限制:如果我想从Runnable返回一个值,看到签名不允许它怎么办?我怎么知道我的Runnable是否因异常而失败?有一些事情,例如异常处理程序等允许使用线程,但它是一个安静的重复,容易出错的任务.

进入java.util.concurrent包!它提供了所有这些(以及更多)的答案!

你想为多个“工作单元”重用线程(不管是Runnableor吗?):你可以.想知道“工作单位”是否完成或失败:你可以.想要返回一个值:你可以.想要将某些任务动态优先于其他任务吗?当然.需要能够安排任务吗?可以做.等等.

用Callables替换你的Runnables(这很简单,两者都是单方法接口!),停止操纵Threads以支持Futures并将管道留给ExecutorService.

My doubt is if Callable is capable of doing everything that Runnable,why so many people use Runnable instead of callable?

也许他们确实有旧代码(Java 1.4?).也许他们不了解更高级别抽象的好处,而更喜欢低级别的Thread东西?

一般来说,由于并发API的出现,绝对没有理由更喜欢使用Threads.

Are there any extra overheads in implementing Callable interface in comparison with Runnable Interface?

在“实现Callable”vs Runnable中,没有没有.但是新的Callable的成本是有成本的,因为在内部,它都会回到Threads和Runnables(至少,当前的实现会这样做).但是你可能实际上获得了性能,因为新的功能就像线程重用更容易!

所以,是的,并发API有它的成本,但它在任何标准用例中绝对,完全可以忽略不计,但它也有新的优势,使它在许多方面变得更好,包括性能.

此外,您已经从API中获得了大量新的可能性(参见Fork / Join框架,请参阅Java 8中的并行流,…),并减少对“自定义”,“自制”的任何扭结的需求“所述功能的并发代码,众所周知很难做到.

利益/成本比完全支持“新”并发API.

猜你在找的Java相关文章