Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程,如下所示:

  1. 继承Thread类创建线程

  2. 实现Runnable接口创建线程

  3. 使用Callable和Future创建线程

下面让我们分别来看看这三种创建线程的方法。
------------------------继承Thread类创建线程---------------------
通过继承Thread类来创建并启动多线程的一般步骤如下

1】定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体。

2】创建Thread子类的实例,也就是创建了线程对象

3】启动线程,即调用线程的start()方法
简单代码示例:

public class MyThread extends Thread{//继承Thread类public void run(){//重写run方法}
}
public class Main {public static void main(String[] args){new MyThread().start();//创建并启动线程}
}

------------------------实现Runnable接口创建线程---------------------

通过实现Runnable接口创建并启动线程一般步骤如下:

1】定义Runnable接口的实现类,一样要重写run()方法,这个run()方法和Thread中的run()方法一样是线程的执行体

2】创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象

3】第三部依然是通过调用线程对象的start()方法来启动线程
简单代码示例:

public class MyThread2 implements Runnable {//实现Runnable接口public void run(){//重写run方法}
}
public class Main {public static void main(String[] args){//创建并启动线程MyThread2 myThread=new MyThread2();Thread thread=new Thread(myThread);thread().start();//或者    new Thread(new MyThread2()).start();}
}

------------------------使用Callable和Future创建线程---------------------

和Runnable接口不一样,Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能要强大。

  1. call()方法可以有返回值

  2. call()方法可以声明抛出异常

Java5提供了Future接口来代表Callable接口里call()方法的返回值,并且为Future接口提供了一个实现类FutureTask,这个实现类既实现了Future接口,还实现了Runnable接口,因此可以作为Thread类的target。在Future接口里定义了几个公共方法来控制它关联的Callable任务。

boolean cancel(boolean mayInterruptIfRunning):视图取消该Future里面关联的Callable任务

get():返回Callable里call()方法的返回值,调用这个方法会导致程序阻塞,必须等到子线程结束后才会得到返回值

get(long timeout,TimeUnit unit):返回Callable里call()方法的返回值,最多阻塞timeout时间,经过指定时间没有返回抛出TimeoutException

boolean isDone():若Callable任务完成,返回True

boolean isCancelled():如果在Callable任务正常完成前被取消,返回True

介绍了相关的概念之后,创建并启动有返回值的线程的步骤如下:
1】创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)。

2】使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值

3】使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口)

4】调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
简单代码示例:

public class Main {public static void main(String[] args){MyThread3 th=new MyThread3();//使用Lambda表达式创建Callable对象//使用FutureTask类来包装Callable对象FutureTask<Integer> future=new FutureTask<Integer>((Callable<Integer>)()->{return 5;});new Thread(task,"有返回值的线程").start();//实质上还是以Callable对象来创建并启动线程try{System.out.println("子线程的返回值:"+future.get());//get()方法会阻塞,直到子线程执行结束才返回}catch(Exception e){ex.printStackTrace();}}
}

--------------------------------------三种创建线程方法对比--------------------------------------
实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值,前者线程执行体run()方法无返回值

简单地说,我们可以用以下判断来确定使用哪一种:

  1. Java只能单继承,如果你想继承其他类的同时使用多线程,那么使用实现Runnable和实现Callable接口这种方式
  2. 实现Runnable和实现Callable接口这种方式多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形
  3. 编程稍微复杂,如果需要访问当前线程,必须调用Thread.currentThread()方法不想复杂化就用继承Thread类创建线程

Java并发编程——创建线程的三种方法以及区别相关推荐

  1. Java 创建线程的三种方法比较

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...

  2. Java创建线程的三种方法

    这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...

  3. 创建线程的三种方式及区别

    一:创建线程的三种方式: 1.继承Thread类 2.实现Runnable接口 3.使用Callable接口 二:创建线程的具体实现步骤: 1.继承Thread类 (1).先继承 Thread类,并且 ...

  4. JAVA中创建线程的三种方法及比较

    JAVA中创建线程的方式有三种,各有优缺点,具体如下: 目录 一.继承Thread类来创建线程 二.实现Runnable接口来创建线程 三.通过Callable和Future来创建线程 四.三种方式创 ...

  5. java线程三种方法,Java基础_线程的使用及创建线程的三种方法

    线程:线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 进程:进 ...

  6. java 创建线程的三种方法_java 创建线程的几种方式

    说道线程,肯定会想到使用 java.lang.Thread.java这个类 那么创建线程也主要有2种方式 第一种方式: public class MyThread extends Thread { p ...

  7. c++11多线程编程(一):创建线程的三种方法

    c++11线程库 原始的c++标准仅支持单线程编程,新的c++标准(c++11或c++0x)于2011年发布,引入了新的线程库. 编译器要求 Linux: gcc 4.8.1 (完全并发支持) Win ...

  8. 创建线程的三种方法_Netty源码分析系列之NioEventLoop的创建与启动

    前言 前三篇文章分别分析了 Netty 服务端 channel 的初始化.注册以及绑定过程的源码,理论上这篇文章应该开始分析新连接接入过程的源码了,但是在看源码的过程中,发现有一个非常重要的组件:Ni ...

  9. NSThread创建线程的三种方法

    1 - (IBAction)NSThreadBtnClick:(id)sender { 2 3 [self threadObjectMethod]; 4 [self threadClassMethod ...

  10. java创建线程哪种方法最好_Java创建线程的三种方法比较

    一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别 (1)Callable规定的方法是call(),Runnable规定的方法是run(). ...

最新文章

  1. MindSpore图像分类模型支持(Lite)
  2. 你还是只会用数组吗?不懂Java集合,还想找工作?(集合概述)
  3. 分布式与人工智能课程(part3)--第三课
  4. http和https和ssl和tcp/ip之间的关系和区别
  5. java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用
  6. blender使用_用Blender教青少年3D动画
  7. Hadoop如何迎击大数据分析的挑战
  8. ubuntu常用软件
  9. python高维数据_高维数据怎样可视化?
  10. 虚拟机ubuntu的联网方法(NET)
  11. ubuntu磁盘格式化
  12. Office XP 试用感受
  13. 企业微信如何自动同步外部客户信息到CRM系统
  14. wkhtmltopdf 照片不显示的问题
  15. Android 启动后台运行程序(Service)
  16. 撕掉代工标签,能否迎来芯片市场的“权力转移”?
  17. 单细胞测序学习笔记(一)——细胞聚类和鉴定
  18. STC8h1k28六个基本实验
  19. 利用 MapReduce分析明星微博数据实战
  20. OTB50、OTB2013、OTB100、OTB2015的区别

热门文章

  1. 2021年 win10 Flash 不可用解决方法
  2. vmlogin效果怎么样?亚马逊防关联超级浏览器,电商多账号管理神器
  3. ssm产品销售管理系统计算机毕业设计
  4. linux HUSTOJ 一些页面修改
  5. 计算机网络怎么算默认网关,ip地址子网掩码计算器_默认网关怎么计算_ip 掩码 网关的关系...
  6. SQL server 数据迁移到mysql
  7. 谢晶:webpower中国区正在向“多渠道智能化营销”全面转型
  8. 初一上册数学用计算机进行运算,初一上册数学
  9. 基于FP5207的5V升12V电路设计
  10. 计算机算法需要什么数学知识,计算机编程算法和数学有什么关系?