Callable、Runnable、Future、Executor的详细使用方法

1.Runnable接口

实现Runnable接口的类必须使用Thread类的实例才能创建线程(事实上,Thread类也实现了Runnable接口),它允许你定义一个可以由线程完成的任务。如大多数人所已知的那样,它只提供了一个run方法,该方法既不接受任何参数,也不返回任何值。如果你需要从一个未完成的任务中返回一个值,你就必须在该接口之外使用一个方法去等待该任务完成时通报的某种消息。例如:

 Runnable runnable = ...;
    Thread t = new Thread(runnable);
    t.start();
    t.join();
    String value = someMethodtoGetSavedValue()

从严格上来说,其实上述代码是没有问题的,但是自从JAVA5.0以后,引入了Callable接口。

2.Cabllable接口

Callable接口其实与Runnable接口类似,只不过Runnable接口是实现run方法,而Callable接口实现call方法。参照Callable的API,该方法可以返回一个Object对象,或可返回任何一个在泛型化格式中定义了的特定类型的对象。因为你不可能把Callable对象传到Thread对象去执行,你可换用ExecutorService对象去执行Callable对象。该服务接受Callable对象,并经由submit方法去执行它。 提交一个Callable对象给ExecutorService会返回一个Future对象。然后,Future的get方法将会阻塞,直到任务完成。call方法的唯一要求是这个值要在call方法的结尾处返回。当Future的get方法稍后被调用时,如果任务运行得很快的话,Future将会自动得到这个值,否则将一直等到该值生成完毕为止。更多信息:

3.Future接口

首先了解Future模式:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以拿着提订单来提货,这期间可以干别的任何事情。其中Future接口就是订货单,真正处理订单的是Executor类,它根据Future接口的要求来生产产品。那么,Future接口是Java线程Future模式的实 现,可以来进行异步计算。

4.Executor接口

Executor接口执行已提交的 Runnables任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。通常使用 Executor 而不是显式地创建线程。并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnalbe)。Executor在执行时使用内部的线程池完成操作。

`Callable` 和 `Runnable` 是 Java 编程中用于实现多线程的接口。 1. `Runnable` 接口是在 Java 1.0 中引入的。它定义了一个抽象方法 `run()`,该方法在新线程中执行。可以通过实现 `Runnable` 接口来创建一个可运行的任务,然后将其传递给 `Thread` 类的构造函数来创建一个新线程。 示例代码: ```java public class MyRunnable implements Runnable { public void run() { // 在这里编写线程的逻辑 } } // 创建线程 Thread thread = new Thread(new MyRunnable()); thread.start(); ``` 2. `Callable` 接口是在 Java 1.5 中引入的。它也定义了一个抽象方法 `call()`,但与 `Runnable` 不同的是,`call()` 方法可以返回结果,并且可以抛出异常。可以通过实现 `Callable` 接口来创建一个可调用的任务,并使用 `ExecutorService` 的 `submit()` 方法来提交任务并获取其返回值。 示例代码: ```java import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class MyCallable implements Callable<String> { public String call() throws Exception { // 在这里编写任务的逻辑 return "Task completed"; // 返回结果 } } // 创建线程池 ExecutorService executor = Executors.newFixedThreadPool(1); // 提交任务并获取 Future 对象 Future<String> future = executor.submit(new MyCallable()); // 获取任务执行结果 String result = future.get(); ``` 总结: - `Runnable` 接口适用于那些不需要返回结果的简单任务。 - `Callable` 接口适用于那些需要返回结果的任务,并且可以抛出异常。 - `Runnable` 接口的方法是 `void` 类型的,而 `Callable` 接口的方法可以指定返回类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值