当前位置: 首页 > news >正文

Callable接口(类似于Runnable)

文章目录

  • Callable接口(类似于Runnable)
    • 一、概念
      • 1、简介
      • 2、API文档
      • 3、源码
    • 二、代码案例
      • 1、案例1(1个线程)
      • 2、案例2(2个线程)


Callable接口(类似于Runnable)

一、概念

1、简介

  • Callable接口类似于Runnable
  • new Thread(new FutureTask(Callable)).start(); 开启线程
  • new Thread().start(); 启动线程

2、API文档

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、源码

在这里插入图片描述

  1. 可以有返回值
  2. 可以抛出异常
  3. 方法不同 call()

二、代码案例

1、案例1(1个线程)

package com.sgz.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 日期:2022/8/29 - 11:30
 * 需求:
 */
public class CallableTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // new Thread(new Runnable()).start();
        // new Thread(new FutureTask<V>()).start();
        // new Thread(new FutureTask<V>(Callable)).start();
      //  new Thread().start();   // 怎么启动 Callable

        MyThread thread = new MyThread();
        FutureTask futureTask = new FutureTask(thread);     // 适配类
        new Thread(futureTask,"A").start();

        Integer o = (Integer) futureTask.get(); // 获取 Callable 的返回结果
        System.out.println(o);
    }
}

// 泛型的参数等于方法的返回值
class MyThread implements Callable<Integer> {

    @Override
    public Integer call() {
        System.out.println("call()");
        return 1024;
    }
}

细节:

  1. 有缓存
  2. 结果可能需要等待,会阻塞

2、案例2(2个线程)

package com.sgz.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 日期:2022/8/29 - 11:30
 * 需求:
 */
public class CallableTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // new Thread(new Runnable()).start();
        // new Thread(new FutureTask<V>()).start();
        // new Thread(new FutureTask<V>(Callable)).start();
      //  new Thread().start();   // 怎么启动 Callable

        MyThread thread = new MyThread();
        FutureTask futureTask = new FutureTask(thread);     // 适配类
        new Thread(futureTask,"A").start();
        new Thread(futureTask,"B").start(); // 结果会被缓存,效率高

        Integer o = (Integer) futureTask.get(); // 获取 Callable 的返回结果,get方法可能会产生阻塞,一般把它放到最好或者使用异步通信来处理
        System.out.println(o);
    }
}

// 泛型的参数等于方法的返回值
class MyThread implements Callable<Integer> {

    @Override
    public Integer call() {
        System.out.println("call()");  
        // 耗时操作
        return 1024;
    }
}

相关文章:

  • CentOS环境下安装Nacos
  • 金仓数据库 KingbaseES 插件参考手册 S (2)
  • 营销软文的结尾怎样写?营销软文结尾怎样去设计?
  • 2022河南萌新联赛第(七)场:南阳理工学院 B 龍
  • 我做了几年的Android应用层开发,为什么还要去学习安卓系统知识?
  • [暑假]Vue框架里面 一些属性和配置项的作用
  • 【unity记录】导入标准资源包(Standard Assets)
  • SoringBoot特点
  • 浅析Java设计模式【3.4】——策略
  • time,datetime模块时间序列讲解
  • Hive的JDBC操作
  • Axure8.0教程:自动带出邮箱
  • VUE+webrtc-streamer实现实时视频播放(监控设备-rtsp)
  • Java进阶常用的辅助类(CountDownLatch 减法计数器、CyclicBarrier 加法计数器、Semaphore 信号量)
  • HWI的安装及使用
  • 【剑指offer】让抽象问题具体化
  • 【前端学习】-粗谈选择器
  • 345-反转字符串中的元音字母
  • CentOS从零开始部署Nodejs项目
  • JavaScript类型识别
  • JavaScript新鲜事·第5期
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • k个最大的数及变种小结
  • laravel with 查询列表限制条数
  • mysql innodb 索引使用指南
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • storm drpc实例
  • Vue 重置组件到初始状态
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 初识 webpack
  • 构造函数(constructor)与原型链(prototype)关系
  • 解决iview多表头动态更改列元素发生的错误
  • 如何在GitHub上创建个人博客
  • 思否第一天
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)虚拟机的安装与使用,linux系统安装
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (30)数组元素和与数字和的绝对差
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (蓝桥杯每日一题)love
  • (十八)三元表达式和列表解析
  • .java 9 找不到符号_java找不到符号
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...