首页 > 代码库 > Java多线程 - Callable和Future
Java多线程 - Callable和Future
已知的创建多线程的方法有继承Tread类和实现Runnable方法。此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体。但是call()方法与run()方法有些不同:
- call()方法可以有返回值
- call()方法可以抛出异常
不过Java不允许Callable对象直接作为Thread的target。而且call()方法还有一个返回值——call()方法并不是直接调用,他是做为线程执行体被调用的。Java提供了Future接口来代表Callable接口里call()方法的返回值,并为Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并实现了Runnable接口,因此可以将之作为Thread的target。
使用Callable和Future创建线程的步骤如下:
创建Callable接口的实现类,并实现call方法;
创建Callable接口实现类的实例,使用FutureTask类来包装Callable对象;
使用FutureTask对象作为Thread对象的target创建并启动新线程;
调用FutureTask对象的方法来获得子线程执行结束后的返回值。
附上实现代码:
package net.ibuluo.hunter;import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;class MyThread implements Callable<String>{ public String call() throws Exception { for(int i=0; i<20; i++){ System.out.println(Thread.currentThread().getName() + " ---- " + i); } return "This is a Test!"; }}public class Test { public static void main(String[] args) { MyThread mt = new MyThread(); FutureTask<String> ft = new FutureTask<String>(mt); for(int i=0; i<20; i++){ System.out.println(Thread.currentThread().getName() + " ---- " + i); if(i==10){ new Thread(ft, "子线程1").start(); } } try{ System.out.println("子线程返回值:" + ft.get()); }catch(Exception e){ e.printStackTrace(); } }}
Java多线程 - Callable和Future
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。