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的更多相关文章
- Java多线程Callable和Future类详解
public interface Callable<V> 返回结果并且可能抛出异常的任务.实现者定义了一个不带任何参数的叫做 call 的方法 public in ...
- Java多线程-Callable的Future返回值的使用
一般使用线程池执行任务都是调用的execute方法,这个方法定义在Executor接口中: public interface Executor { void execute(Runnable comm ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- java并发--Callable、Future和FutureTask
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就 ...
- java 多线程 Callable中的futrue模式
java实现Callable接口中用到了future模式,所以实现了这个接口就看到了有返回值,那它的基本原理是什么鬼,往下看. 何为future模式? future模式有点类似于商品订单.在网上购物时 ...
- JAVA 多线程 Callable 与 FutureTask:有返回值的多线程
java多线程中,如果需要有返回值,就需要实现Callable接口. 看例子: 先建立一个Dowork这个类,就是平时某个业务的实现 package com.ming.thread.one; impo ...
- Java Callable Future Example(java 关于Callable,Future的例子)
Home » Java » Java Callable Future Example Java Callable Future Example April 3, 2018 by Pankaj 25 C ...
- Java - 多线程Callable、Executors、Future
http://blog.csdn.net/pipisorry/article/details/44341579 Introduction Callable接口代表一段能够调用并返回结果的代码; Fut ...
随机推荐
- Powershell Get-ChildItem 筛选文件,文件处理
使用Where-Object也可以根据其它属性来过滤. Dir | Where-Object { $_.CreationTime -gt [datetime]::Parse("May 12, ...
- Powershell Exchange Server UP Time
Server up time Get-ExchangeServer | where{$_.name -like'wendy*'} | %{ if(Test-Connection $_.name -Co ...
- nodejs unit test related----faker-cli, sinonjs, mock/stub
http://www.tuicool.com/articles/rAnaYvn http://www.tuicool.com/articles/Y73aYn (contrast stub and mo ...
- sqlalchemy笔记
http://jzqt.github.io/2015/12/29/SQLAlchemy%E7%AC%94%E8%AE%B0/ 用SQLAlchemy做ORM也有一段时间了,总结一下用过的一些地方. 连 ...
- JQuery设置checkbox选中或取消等相关操作
$("[name='checkbox']").attr("checked",'true');//全选 $("[name='checkbox']&quo ...
- java 日期的格式化 输入/输出
想要得到形如2018.07.09的格式化好的当天日期 创建Date对象,调用SimpleDateFormat对象的format方法: indexstr="logstash-"+ne ...
- Css选择器定位详解
1.使用 class 属性来定位元素,方法如下: driver.findElement(By.cssSelector("input.login")); 即可以先指定一个 HTML的 ...
- Thinkphp的list_to_tree 实现无限级分类列出全部节点
list_to_tree 使用起来十分方便,具体可查看手冊.由于我在用的时候须要同一时候列出全部节点,所以写了一个递归函数,拿出来供大家參考. public function index(){ Loa ...
- Vue.js——框架
一.什么是VUE vue 是一个构建用户界面的javascript框架 特点:轻量,高效 特性:双向数据绑定,数据驱动视图 二.vue的使用 1.引入vue.js <script src=vue ...
- Numpy中的时间类型
从Numpy1.7开始,已经有了原生的日期-时间支持,基本类型称为datetime64. In [1]: import numpy as np In [2]: nd = np.datetime64(' ...