首页 技术 正文
技术 2022年11月20日
0 收藏 510 点赞 4,730 浏览 2030 个字

一.通过Callable接口实现多线程

c.实现Callable重写call方法
实现Callable和实现Runnable类似,但是功能更强大,具体表现在
a.可以在任务结束后提供一个返回值,Runnable不行
b.call方法可以抛出异常,Runnable的run方法不行
c.可以通过运行Callable得到的Fulture对象监听目标线程调用call方法的结果,得到返回值,(fulture.get(),调用后会阻塞,直到获取到返回值)

1.Callable接口介绍:

(1)java.util.concurrent.Callable是一个泛型接口,只有一个call()方法

(2)call()方法抛出异常Exception异常,且返回一个指定的泛型类对象

2.Callable接口实现多线程的应用场景

(1)当父线程想要获取子线程的运行结果时

3.使用Callable接口实现多线程的步骤

(1)第一步:创建Callable子类的实例化对象

(2)第二步:创建FutureTask对象,并将Callable对象传入FutureTask的构造方法中

(注意:FutureTask实现了Runnable接口和Future接口)

(3)第三步:实例化Thread对象,并在构造方法中传入FurureTask对象

(4)第四步:启动线程

例1(利用Callable接口实现线程):

利用Callable接口创建子线程类:

package com.my.frame;import java.util.concurrent.Callable;public class ThreadCall implements Callable<String> {    @Override
public String call() throws Exception {
// TODO Auto-generated method stub
System.out.println("=====");
return "9999";
}}
package com.my.frame;import java.util.concurrent.FutureTask;public class TestThread {
public static void main(String[] args) { FutureTask<String> ft = new FutureTask<>(new ThreadCall());
new Thread(ft).start();
}}

例2(匿名类部类实现Callable接口创建子线程):

匿名类部类实现Callable接口创建子线程类并实现:

package call;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;//匿名类部类实现Callable接口创建子线程public class AnonyCallable {    public static void main(String[] args) {    Callable<String> cl = new Callable<String>() {    @Override    public String call() throws Exception {            System.out.println(Thread.currentThread().getName() + "正在行军~~~");            System.out.println(Thread.currentThread().getName() + "遭遇敌军~~~");            System.out.println(Thread.currentThread().getName() + "奋勇杀敌!!!!");            return "战斗胜利,俘虏敌军50000人";            }};        FutureTask<String> ft = new FutureTask(cl);        new Thread(ft, "李存孝部队").start();try {        Thread.currentThread().setName("李存勖部队");        Thread.sleep(3000);        System.out.println(Thread.currentThread().getName() + "休整3000ms");} catch (InterruptedException e) {    e.printStackTrace();}    System.out.println(Thread.currentThread().getName() + "整顿完毕,等待友军消息...");try {            String str = ft.get();            System.out.println("李存勖部队得知友军消息为:" + str);} catch (InterruptedException | ExecutionException e) {    e.printStackTrace();    }}
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,565
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,413
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,186
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905