Java并发编程——创建线程的三种方法以及区别
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程,如下所示:
继承Thread类创建线程
实现Runnable接口创建线程
使用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()方法功能要强大。
call()方法可以有返回值
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()方法无返回值
简单地说,我们可以用以下判断来确定使用哪一种:
- Java只能单继承,如果你想
继承其他类的同时使用多线程
,那么使用实现Runnable和实现Callable接口这种方式 - 实现Runnable和实现Callable接口这种方式
多个线程可以共享一个target对象
,非常适合多线程处理同一份资源的情形 - 编程稍微复杂,如果
需要访问当前线程,必须调用Thread.currentThread()方法
,不想复杂化就用继承Thread类创建线程
Java并发编程——创建线程的三种方法以及区别相关推荐
- Java 创建线程的三种方法比较
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...
- Java创建线程的三种方法
这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...
- 创建线程的三种方式及区别
一:创建线程的三种方式: 1.继承Thread类 2.实现Runnable接口 3.使用Callable接口 二:创建线程的具体实现步骤: 1.继承Thread类 (1).先继承 Thread类,并且 ...
- JAVA中创建线程的三种方法及比较
JAVA中创建线程的方式有三种,各有优缺点,具体如下: 目录 一.继承Thread类来创建线程 二.实现Runnable接口来创建线程 三.通过Callable和Future来创建线程 四.三种方式创 ...
- java线程三种方法,Java基础_线程的使用及创建线程的三种方法
线程:线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 进程:进 ...
- java 创建线程的三种方法_java 创建线程的几种方式
说道线程,肯定会想到使用 java.lang.Thread.java这个类 那么创建线程也主要有2种方式 第一种方式: public class MyThread extends Thread { p ...
- c++11多线程编程(一):创建线程的三种方法
c++11线程库 原始的c++标准仅支持单线程编程,新的c++标准(c++11或c++0x)于2011年发布,引入了新的线程库. 编译器要求 Linux: gcc 4.8.1 (完全并发支持) Win ...
- 创建线程的三种方法_Netty源码分析系列之NioEventLoop的创建与启动
前言 前三篇文章分别分析了 Netty 服务端 channel 的初始化.注册以及绑定过程的源码,理论上这篇文章应该开始分析新连接接入过程的源码了,但是在看源码的过程中,发现有一个非常重要的组件:Ni ...
- NSThread创建线程的三种方法
1 - (IBAction)NSThreadBtnClick:(id)sender { 2 3 [self threadObjectMethod]; 4 [self threadClassMethod ...
- java创建线程哪种方法最好_Java创建线程的三种方法比较
一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别 (1)Callable规定的方法是call(),Runnable规定的方法是run(). ...
最新文章
- MindSpore图像分类模型支持(Lite)
- 你还是只会用数组吗?不懂Java集合,还想找工作?(集合概述)
- 分布式与人工智能课程(part3)--第三课
- http和https和ssl和tcp/ip之间的关系和区别
- java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用
- blender使用_用Blender教青少年3D动画
- Hadoop如何迎击大数据分析的挑战
- ubuntu常用软件
- python高维数据_高维数据怎样可视化?
- 虚拟机ubuntu的联网方法(NET)
- ubuntu磁盘格式化
- Office XP 试用感受
- 企业微信如何自动同步外部客户信息到CRM系统
- wkhtmltopdf 照片不显示的问题
- Android 启动后台运行程序(Service)
- 撕掉代工标签,能否迎来芯片市场的“权力转移”?
- 单细胞测序学习笔记(一)——细胞聚类和鉴定
- STC8h1k28六个基本实验
- 利用 MapReduce分析明星微博数据实战
- OTB50、OTB2013、OTB100、OTB2015的区别
热门文章
- 2021年 win10 Flash 不可用解决方法
- vmlogin效果怎么样?亚马逊防关联超级浏览器,电商多账号管理神器
- ssm产品销售管理系统计算机毕业设计
- linux HUSTOJ 一些页面修改
- 计算机网络怎么算默认网关,ip地址子网掩码计算器_默认网关怎么计算_ip 掩码 网关的关系...
- SQL server 数据迁移到mysql
- 谢晶:webpower中国区正在向“多渠道智能化营销”全面转型
- 初一上册数学用计算机进行运算,初一上册数学
- 基于FP5207的5V升12V电路设计
- 计算机算法需要什么数学知识,计算机编程算法和数学有什么关系?