Callable 接口实现java 的多线程

2023-11-18

java 中创建多线程最常见的是继承Thread 的子类重写run() 方法,还有就是实现Runnable 接口

我们最好使用实现了Runnable 接口的方法原因有两点:
①因为java 的单继承的特点,所以说使用第一种方法不能继承其他父类了
②采用接口的方式便于实现数据共享,线程的启动需要Thread类的start方法,如果采用继承的方式每次新建一个线程时,每个新建线程的数据都会单独的存在线程内存中,这样每个线程会单独的操作自己线程的数据,不能更好的实现线程之间的数据共享)

如果我们想要我们的线程有返回值,那么我们可以实现Callable 接口

@FunctionalInterface
public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

这里我传入了一个String类型作为接口call方法的返回值类型,然后实现了call方法,将result作为返回结果返回。

public class MyCallable<String> implements Callable<String> {
 
	private int tickt=10;
	
	@Override
	public String call() throws Exception {
		// TODO Auto-generated method stub
		String result;
		while(tickt>0) {
			System.out.println("票还剩余:"+tickt);
			tickt--;
		}
		result=(String) "票已卖光";
		return result;
	} 
}

采用实现Callable接口实现多线程启动方式和以往两种的方式不太一样,下面就看一下怎样启动采用实现Callable接口的线程,首先我 new 一个我的实现实例,然后将我生成的实例对象注册进入到FutureTask类中,然后将FutureTask类的实例注册进入Thread中运行。最后可以采用FutureTask中的get方法获取自定义线程的返回值。

	public static void main(String[] args) throws InterruptedException, ExecutionException {		
		MyCallable<String> mc=new MyCallable<String>();
		FutureTask<String> ft=new FutureTask<String>(mc);
		new Thread(ft).start();
		String result=ft.get();
		System.out.println(result);
	}

看一下FutureTask 类的源码实现

public class FutureTask<V> implements RunnableFuture<V>{ 
 
 
 public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
        this.callable = callable;
        this.state = NEW;       // ensure visibility of callable
    }
}

再来看一下RunnableFuture 的底层实现

public interface RunnableFuture<V> extends Runnable, Future<V> {
    /**
     * Sets this Future to the result of its computation
     * unless it has been cancelled.
     */
    void run();
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Callable 接口实现java 的多线程 的相关文章

随机推荐

  • java中的垃圾回收机制

    概述 JAVA中的垃圾回收机制是自动的 它是保证程序健壮的主要手段 同时也避免了回收内存带来的代码繁琐 注意 1 java中的垃圾回收机制采用的是多线程技术实现的 垃圾回收功能是一条优先级比较低的线程 2 垃圾回收机制仅仅作用于堆内存 和栈
  • Unity一些很有用的技巧

    一 性能 多线程射线检测 在使用中经常需要每帧进行射线 性能消耗比较大 那么可以使用Unity Collections RaycastCommand进行多线程的检查 将耗能操作放到子线程去 同样其他的形状检测 Unity官方文档 Rayca
  • Python每日一记196>>>pandas.core.indexing.IndexingError: Too many indexers

    以下代码出现了pandas core indexing IndexingError Too many indexers问题 import pandas as pd import numpy as np data 2018 pd read e
  • Rust组合器

    组合器 在 Rust 中 组合器更多的是用于对返回结果的类型进行变换 例如使用 ok or 将一个 Option 类型转换成 Result 类型 下面我们来看看一些常见的组合器 or 和 and 跟布尔关系的与 或很像 这两个方法会对两个表
  • JAVA 8 junit 单元测试——静态方法单元测试 Mockito.mockStatic

    静态方法的单元测试Mockito 直接上例子 方法 public ArrayList
  • 深度缓冲详解(DepthBuffer)

    参考出处 1 OpenGL 深度缓冲区 Z缓冲区 介绍 2 什么是深度缓冲 Depth Buffer 1 深度缓冲概念 深度缓冲区与帧缓冲区相对应 用于记录上面每个像素的深度值 通过深度缓冲区 我们可以进行深度测试 从而确定像素的遮挡关系
  • VMware安装流畅系统Chrome OS以及国产系统FedyOS(基于Chrome OS的二次开发)

    一 序言 VMware 版本 15 5 6 物理机型号 芯片类型不限制 不向之前发布的vmware安装Mac OS篇 想看的点击这 二 链接资源 Chrome OS CloudReady Home v83 x64 点击进入 提取码 yyds
  • linux与线程

    1 1 1 进程 在早期 人们都是为特定机器编写程序 并在其上运行计算任务 task 渐渐的人们发现CPU与IO设备之间速度差太多了 往往CPU都在空转 是不是可以在CPU空闲的时候做些其他事呢 于是 就有了多任务 每个任务就是一个进程 有
  • excel wind插件使用_Python和wind的交互—在债券中的应用

    个人认为学会了怎么用python和wind交互以及怎么用python处理Excel数据 就基本能替换日常很多琐碎的债券工作 还不用担心Excel某个值改变了导致整个报表都毁了 事实上在python调用wind函数和在Excel中调用函数一样
  • Lua: string字符串的处理

    目录 1 字符串的三种表示方式 2 字符串操作 3 特别说一下 dump序列化Lua 函数 1 字符串的三种表示方式 lua 字符串的三种表示 单引号字符串 string a hello world print string a 双引号字符
  • Selenium控制已打开的chrome、IE浏览器

    0 为什么要接管打开的浏览器 1 重复重新登录 过程麻烦 2 拖慢爬虫的运行速度 3 容易让网站检测到账号异常 如何解决重复登录的问题 1 使用登录过的cookie 下次运行时设置保存 2 接管打开的浏览器 也是我们接下来重点讲的 1 控制
  • 9.Markdown 高级技巧(内嵌HTML+公式+对齐方式)

    支持的 HTML 元素 CSDN支持kbd标签 有道云目前不支持 使用
  • Java基础面试题

    1 面向对象的特征有哪些方面 1 抽象 抽象就是忽略一个主题中与当前目标无关的那些方面 以便更充分地注意与当前目标有关的方面 抽象并不打算了解全部问题 而只是选择其中的一部分 暂时不用部分细节 抽象包括两个方面 一是过程抽象 二是数据抽象
  • 十分钟让你明白Objective-C的语法(和Java、C++的对比)

    很多想开发iOS 或者正在开发iOS的程序员以前都做过Java或者C 当第一次看到Objective C的代码时都会头疼 Objective C的代码在语法上和Java C 有着很大的区别 有的同学会感觉像是看天书一样 不过 语言都是相通的
  • smp和mpp计算机

    SMP 是Symmetric Multi Processing的简称 意为对称多处理系统 内有许多紧耦合多处理器 这种系统的最 大特点就是共享所有资源 MPP 另外与之相对立的标准是MPP Massively Parallel Proces
  • Linux驱动

    Linux驱动入门系列 Linux驱动入门 一 字符设备驱动基础 Linux驱动入门 二 操作硬件 Linux驱动入门 三 Led驱动 Linux驱动入门 四 非阻塞方式实现按键驱动 Linux驱动入门 五 阻塞方式实现按键驱动 Linux
  • ​7.1 项目1 学生通讯录管理:文本文件增删改查(C++版本)(自顶向下设计+断点调试) (A)​

    C 自学精简教程 目录 必读 作业目标 这个作业中 你需要综合运用之前文章中的知识 来解决一个相对完整的应用程序 作业描述 1 在这个作业中你需要在文本文件中存储学生通讯录的信息 并在程序启动的时候加载这些数据到内存中 2 在程序运行过程中
  • 用Python绘制六种可视化图表,简直太好用了

    前言 本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 如有问题请及时联系我们以作处理 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可加入 可视化图表
  • 邻接矩阵实现的带权有向图(C++)

    邻接矩阵实现的带权有向图 C 相关概念 定义和声明 实现 1 距离无穷大的定义 2 构造函数 3 深度优先遍历 4 广度优先遍历 6 将邻接矩阵转换为邻接表 7 重载 lt lt 运算符 打印输出 测试 测试代码 测试结果 源代码 相关概念
  • Callable 接口实现java 的多线程

    java 中创建多线程最常见的是继承Thread 的子类重写run 方法 还有就是实现Runnable 接口 我们最好使用实现了Runnable 接口的方法原因有两点 因为java 的单继承的特点 所以说使用第一种方法不能继承其他父类了 采