多线程 - Callable接口
来源:互联网 发布:声音好听的网络男歌手 编辑:程序博客网 时间:2024/06/14 18:50
概述
从Java 5开始,Java就提供了Callable接口,可以把它看作是Runnable接口的增强版:Callable接口提供了一个call()方法作为线程执行体,它可以有返回值,并且可以抛异常。但是如何获取call()方法的返回值呢?
Java 5提供了Future接口来代表call()方法的返回值,并为Future接口提供了FutureTask实现类,该类实现了Callable接口和Runnable接口。Future接口中定义了几个公共方法来控制它关联的Callable任务:
- boolean cancel(boolean):试图取消该Future关联的Callable任务。
- V get():返回call()方法的返回值。该方法将导致程序阻塞,必须等到子线程结束后才得到返回值。
- V get(long timeout, TimeUnit unit):返回call()方法的返回值。该方法最多阻塞timeout和unit指定的时间,如果超过指定时间没有返回,将会抛出TimeoutException。
- boolean isCancelled():如果在Callable任务正常结束前被取消,则返回true。
- boolean isDone():如果Callable任务已经完成,则返回true。
代码示例
创建并启动Callable线程的步骤如下:
(1)创建Callable接口实现类,并实现call()方法;
(2)创建Callable实现类的实例,并用FutureTask来包装Callable对象,该FutureTask对象封装了call()方法的返回值;
(3)使用FutureTask对象座位Thread的target创建并启动线程;
(4)调用FutureTask对象的get()方法来获得call()方法的返回值。
注意,Callable接口有泛型限制,Callable接口中的泛型形参类型必须与call()方法返回值类型相同。
package Demo;import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;//Callable接口的泛型形参类型与call方法返回值类型一致public class Demo implements Callable<Integer> { @Override public Integer call() {int i = 0;for (; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " i的值:" + i);}return i; } public static void main(String[] args) {// 创建Callable对象Demo dm = new Demo();// 使用FutureTask包装Callable对象FutureTask<Integer> task = new FutureTask<>(dm);for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " i的值:" + i); if (i == 20) {new Thread(task, "有返回值的线程").start(); }}try { System.out.println("子线程执行结束,i的值:" + task.get());} catch (Exception e) { e.printStackTrace();} }}
主程序中当 i 的值等于20时,就会启动Callable子线程,此时主线程和子线程并发执行。最后程序通过FutureTask对象的get()方法来获取call()方法的返回值——该方法会导致主线程阻塞,直到call()方法执行结束。如果将try中的语句移到if语句块中,会发现当 i 等于20时,等到子线程打印完毕后,主线程继续从21开始打印。读者可以自己尝试。下面是本例的测试结果:
<pre name="code" class="html">main i的值:0main i的值:1......main i的值:24有返回值的线程 i的值:0main i的值:25有返回值的线程 i的值:1main i的值:26有返回值的线程 i的值:2main i的值:27有返回值的线程 i的值:3main i的值:28有返回值的线程 i的值:4main i的值:29有返回值的线程 i的值:5main i的值:30......main i的值:92有返回值的线程 i的值:36main i的值:93有返回值的线程 i的值:37main i的值:94有返回值的线程 i的值:38main i的值:95有返回值的线程 i的值:39main i的值:96有返回值的线程 i的值:40main i的值:97有返回值的线程 i的值:41main i的值:98有返回值的线程 i的值:42main i的值:99有返回值的线程 i的值:43......有返回值的线程 i的值:99子线程执行结束,i的值:100
1 0
- 多线程 - Callable接口
- Callable接口实现多线程
- Java多线程Callable接口
- Callable接口实现多线程
- java 多线程callable接口实现
- 使用Callable接口实现多线程
- 通过Callable接口实现多线程
- 通过Callable接口实现多线程
- 通过Callable接口实现多线程
- Java多线程之Callable接口的实现
- Java多线程之Callable接口的实现
- Java多线程之Callable接口的实现
- Java多线程之Callable接口的实现
- Java多线程之Callable接口的实现
- JAVA多线程Callable接口的实现
- Java多线程之Callable接口的实现
- Java多线程之Callable接口的实现
- Java多线程之Callable接口的实现
- MySQL入门——约束简介、外键约束说明、外键约束主表与子表的创建与使用约束案例
- 给图片设置小圆点
- Android编程问题解决之Error should use android showAsAction
- C++的函数的重载
- 【Java基础】基本类型与运算
- 多线程 - Callable接口
- HTTP状态码
- ORA-22992:无法使用从远处表选择LOB定位器
- linux Cent-OS 安装中文输入法
- 浅谈设计模式之观察者模式
- assignment,shallow copy,deep copy,引用,不可变对象
- 《编程之美》- 2.14 - 求数组的子数组之和的最大值
- string in C++98 的用法总结
- C++多继承