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;@Overridepublic String call() throws Exception {// TODO Auto-generated method stubString 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();
}

Callable 接口实现java 的多线程相关推荐

  1. 线程创建方式3-实现 callable接口(Java)

    线程创建方式3-实现 callable接口(Java) 线程创建方式三:实现 callable接口 callable的好处: 1.可以定返回值 2.可以抛出异常 package src.Demo02; ...

  2. 【Java】线程创建方式:Callable接口 / 使用线程池

    面试题:创建多线程有有哪几种方式? 回答:4种. 实现Runnable接口(重写Run方法) 继承Thread类 实现Callable接口(重写Call方法,与Run不同的是,Call方法有返回值) ...

  3. 实现Callable接口创建多线程

    新增方式一:实现Callable接口 与Runnable相比,Callable功能更强大些 相比run()方法,可以有返回值 方法可以抛出异常 支持泛型的返回值 需要借助FutureTask类,比如获 ...

  4. java的多线程实现方式_java 多线程实现方式

    本文主要是对java 多线程知识的总结,做个记录,温故知新. 多线程有三种实现方式,具体如下. 继承Thread类创建线程类 重写run方法,完成线程需要做的任务. 创建实例 调用start()启动线 ...

  5. Java中多线程、多线程的实现方式、同步代码块的方式

    多线程 进程 线程 概念 目前的程序是单线程 线程的组成部分 代码实现多线程的方式 第一种方式 第二种方式 第三种方式 -- 线程池 第四种方式:Callable 线程状态 线程同步 临界资源 原子操 ...

  6. JAVA实现多线程的三种方式

    在Java中可通过三种方式来实现多线程: 1.继承Thread类,重写run( )方法 2.实现Runnable接口,重写run( )方法 3.实现Callable接口,重写call( )方法并使用F ...

  7. 【Java之多线程篇】——吐血整理Java多线程详解(知识点+代码)

    目录: 线程基本概念 并行\并发的区别 多线程优点和何时使用多线程 多线程创建的两种方式:继承Thread类.实现Runnable接口(代码) Thread类中的常用方法 线程的生命周期 线程的同步 ...

  8. 面试准备-Java并发/多线程总结

    目录 常见问题 1. 线程和进程有什么区别? 2. 创建线程的三种方式的对比? 3. 为什么要使用多线程呢? 4. 线程的状态流转 5. 什么是线程死锁?如何避免死锁? 6. 常见的对比 7. sle ...

  9. Callable 接口

    Callable 接口 是 java.util.concurrent.下的一个泛型接口 , 只有一个call () 方法 , 它是有返回值的 ,  我们可以获取多线程执行的结果 , 使用 Callab ...

最新文章

  1. [YTU]_2478( C++习题 虚函数-计算图形面积)
  2. list集合去重复元素
  3. 面试之BI-SQL--table转换
  4. [BZOJ3583]杰杰的女性朋友(矩阵快速幂)
  5. js 把线性的数据结构改成树形结构
  6. linux screen vim 颜色不一样,tmux中的Vim显示错误的颜色
  7. meta标签以及一些基本标签
  8. 创建前缀一样的文件_Win10更快速创建或重命名仅扩展名文件
  9. MySQL数据库的设计和命令行模式下建立详细过程
  10. swift 运算符快速学习(建议懂OC或者C语言的伙伴学习参考)
  11. 如何在Ubuntu系统中使用github
  12. G502使用计算机配置,Logitech G502,G402游戏鼠标宏设置教程一目了然
  13. 飞翔的小鸟(FlyBird)游戏C语言编程(含撞柱子)
  14. excel两个指标相关性分析_如何在Excel中计算两个变量之间的相关系数?
  15. 【转】弹出USB大容量存储设备时出问题的解决方法
  16. 【泡咖啡1】linux下caffe编译以及python环境配置手记
  17. 极路由刷个人编译的openwrt固件全过程
  18. cocos creator 3D | 拇指投篮 | 3D项目入门实战
  19. Java中身份证、电话号码用星号(****)加以保护
  20. 睡眠的一场革命!-读《睡眠革命》笔记(中)

热门文章

  1. 康青老师--产品开发IPD流程和研发项目管理--流程建设和流程优化-沪师经纪刘建
  2. 游戏试玩站打码赚钱任务网平台系统源码+可运营
  3. Java基础 - AO BO DO PO VO DAO DTO POJO
  4. 奥运门票可以网上卖,火车票为什么不行
  5. 第一视角体验搭载全志T507-H的开发板MYD-YT507H开发板
  6. ps2018首选项出现要求96和8之间的整数怎么办?
  7. CE162Lec06的学习记录
  8. 莫言 | 古人说过自相矛盾的话
  9. Android应用全屏显示
  10. 开源 chatgpt 项目私有化部署