一.通过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();

    }

}
}

通过Callable接口实现多线程的更多相关文章

  1. 使用Runnable和Callable接口实现多线程的区别

    使用Runnable和Callable接口实现多线程的区别 先看两种实现方式的步骤: 1.实现Runnable接口 public class ThreadDemo{ public static voi ...

  2. 实现Callable接口实现多线程

    package com.roocon.thread.t2; import java.util.concurrent.Callable; import java.util.concurrent.Exec ...

  3. callable接口的多线程实现方式

    package com.cxy.juc; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionExce ...

  4. 使用Callable接口创建线程和使用线程池的方式创建线程

    1.使用Callable接口的方式实现多线程,这是JDK5.0新增的一种创建多线程的方法 package com.baozi.java2; import java.util.concurrent.Ca ...

  5. 使用Thread类和Runnable接口实现多线程的区别

    使用Thread类和Runnable接口实现多线程的区别 先看两种实现方式的步骤: public class ThreadDemo{ public static void main(String[] ...

  6. 多线程——实现Callable接口

    前两篇博客(多线程--继承Thread类.多线程--实现Runnable接口 )介绍了java使用线程的两种方法.这篇博客继续介绍第三种方法--实现Callable接口. 先说一下Runnable和C ...

  7. 实现多线程的方式之实现Callable接口

    package com.hls.juc; import java.util.concurrent.Callable;import java.util.concurrent.ExecutionExcep ...

  8. 51、多线程创建的三种方式之实现Callable接口

    实现Callable接口创建线程 Callable接口是在jdk5版本中加入的,这个接口在java.util.concurrent包下面,与其他两种方式不同的地方在于使用Callable接口创建的线程 ...

  9. 多线程----Thread类,Runnable接口,线程池,Callable接口,线程安全

    1概念 1.1进程 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 任务管理器中: 1.2线程 线程是进程中的一个执行单元 ...

随机推荐

  1. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-2.微信扫一扫功能开发前期准备

    笔记 2.微信扫一扫功能开发前期准备         简介:讲解微信扫一扫功能相关开发流程和资料准备              1.微信开放平台介绍(申请里面的网站应用需要企业资料)          ...

  2. Scrapy框架——使用CrawlSpider爬取数据

    引言 本篇介绍Crawlspider,相比于Spider,Crawlspider更适用于批量爬取网页 Crawlspider Crawlspider适用于对网站爬取批量网页,相对比Spider类,Cr ...

  3. Python之Numpy:二元函数绘制/三维数据可视化/3D

    意义 在机器学习任务中选择计算模型或者学习数学时,可视化有助于研究函数值的变化趋势(观察收敛.分布.几何形状等),带来直观的感受. 源码 # 绘制二元函数 # 参考文献 # + python画二元函数 ...

  4. java-创建对象实例

    1.A a = new A(); 2.Class class = B.Class; B b = class .newInstance();

  5. vue路由传参的几种基本方式

    原文地址 this.$router.push跳转 现有如下场景,点击父组件的li元素跳转到子组件中,并携带参数,便于子组件获取数据.父组件中: <li v-for="article i ...

  6. 浏览器F12功能键对测试工程师的重要性

    F键,功能键,Function键.F12常用于网站界面测试.调试,分析网页所出现的问题,查看html元素.查看响应事件等方面. 打开一个网页,点击F12,弹出一个窗口,其窗口的功能如下: 1 Elem ...

  7. SQL易错锦集

    1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引 ...

  8. kubernetes的namespaces总是Terminating

    0.尝试强制删除不行 删除时带上–force --grace-period=0参数 ,无法删除:kubectl delete namespace rook-ceph --force --grace-p ...

  9. kafka原理和操作

    参考: 原理: https://www.cnblogs.com/yinzhengjie/p/9780976.html 常用配置参数: https://www.cnblogs.com/yinzhengj ...

  10. springboot整合filter

    新建一个项目 新建Firstfilter类 Firstfliter.java package com.example.filter; import java.io.IOException; impor ...