博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JUC-Callable
阅读量:5225 次
发布时间:2019-06-14

本文共 2082 字,大约阅读时间需要 6 分钟。

实现线程的方式有四种:

1,实现runnable接口:

2,继承Thread。

3,也就是本节的Callable接口。

4,使用线程池。

区别:

实现Callable接口的方式,相较于实现Runnable接口方式,可以有返回值,并且可以抛出异常。

执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。  FutureTask 是  Future 接口的实现类

FutureTask 可用于闭锁,FutureTask.get()方法用于获取线程结果,在线程里面的call方法没有执行完,获取到结果之前,FutureTask.get()之后的代码不会执行

效果类似于countDownLatch,countDownLatch在所有运行结束之前,latch.await()之后代码不会执行。

 

步骤:

1,新建一个线程类实现Callable接口,Callable接口里面有泛型,用来定义返回结果类型,重写call方法

call方法的返回类型即使泛型的结果类型:

并且call方法能抛出异常:

class ThreadDemo implements Callable
{ @Override public Integer call() throws Exception {

2,实例化线程类:

ThreadDemo td = new ThreadDemo();

3,使用FutureTask类,参数就是线程类对象。

//1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。        FutureTask
result = new FutureTask<>(td);

4,把FutureTask对象作为Thread类参数,启动线程:

new Thread(result).start();

5,通过FutureTask对象,获取线程执行结果:

Integer sum = result.get();  //FutureTask 可用于 闭锁

 

实例:

package com.atguigu.juc;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/* * 一、创建执行线程的方式三:实现 Callable 接口。 相较于实现 Runnable 接口的方式,方法可以有返回值,并且可以抛出异常。 *  * 二、执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。  FutureTask 是  Future 接口的实现类 */public class TestCallable {        public static void main(String[] args) {        ThreadDemo td = new ThreadDemo();        //1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。        FutureTask
result = new FutureTask<>(td); new Thread(result).start(); //2.接收线程运算后的结果 try { Integer sum = result.get(); //FutureTask 可用于 闭锁 System.out.println(sum); System.out.println("------------------------------------"); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } }}class ThreadDemo implements Callable
{ @Override public Integer call() throws Exception { int sum = 0; for (int i = 0; i <= 1000; i++) { sum += i; } return sum; } }

 

转载于:https://www.cnblogs.com/alsf/p/9131473.html

你可能感兴趣的文章
Kafka如何保证消息不丢失不重复
查看>>
delegate事件代理
查看>>
cf1172E Nauuo and ODT(LCT)
查看>>
进程和线程的区别?优缺点
查看>>
英语 - 词法
查看>>
Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2]
查看>>
hiho_1048_状态压缩2
查看>>
GPS USB驱动串口被占用
查看>>
排序方法——选择排序
查看>>
软件建模——第5章 总体设计
查看>>
hack:选择符前缀法,样式属性前缀法
查看>>
springsecurity基于数据库验证用户
查看>>
探索并发编程(七)------分布式环境中并发问题
查看>>
iOS开发之Socket编程
查看>>
SugarCRM 插件介绍
查看>>
java之struts2之拦截器
查看>>
多线程笔记
查看>>
Java 常用类 -String VS StringBuffer
查看>>
签名算法
查看>>
hdu 4512 吉哥系列故事——完美队形I(最长公共上升序列)
查看>>