创建线程几种方式

创建线程的几种方式:
方式1:通过继承Thread类创建线程
步骤:1.定义Thread类的子类,并重写该类的run方法,该方法的方法体就是线程需要执行的任务,因此run()方法也被称为线程执行体
2.创建Thread子类的实例,也就是创建了线程对象
3.启动线程,即调用线程的start()方法

在这里插入图片描述
方式2:通过实现Runnable接口创建线程
步骤:1.定义Runnable接口的实现类,一样要重写run()方法,和第一种方式一样,这里的run()方法也是线程的执行体
2.创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread类才是真正的线程对象
3.依然是通过调用线程对象的start方法来启动线程
在这里插入图片描述
方式3:使用Callable和Future来创建线程
注意:和Runnable接口不一样,Callable接口提供了一个call()方法来作为线程的执行体,call()方法比run()方法功能要更加强大,call()方法可以有返回值,call()方法可以声明抛出异常(前两种如果要抛异常只能通过try,catch来实现)。
步骤:1.创建Callable接口的实现类,并实现call()方法,然后创建该类的实例
2.使用Future Task类来包装Callable对象。该FutureTask对象封装了Callable对象的call()方法的返回值
3.使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口并在重写的run方法中执行call方法)
4.调用FutureTask对象的get方法来获取线程执行结束后的返回值
在这里插入图片描述

方法4:通过线程池来创建线程
注意:ExecutorService es = Executors.newFixedThreadPool(30);
ExecutorService es = Executors.newCachedThreadPool();
FixedThreadPool创建的线程池-》用户可以指定线程池大小,但指定了就不可变
CachedThreadPool创建的线程池-》线程池大小可变
在这里插入图片描述
几种创建线程方式的对比:
实现Runnable和实现Callable接口方式基本相同,不过是后者执行call方法并且有返回值,而run方法无任何返回值,因此可以把这两种方式归为一种方式与继承Thread类的方式进行对比,差别如下(以实现接口方式为主):
1.线程只是实现Runnable接口或Callable接口,还可以继承其他类(有点像接口和抽象类的区别,java是单继承的,但可以实现多个接口)
2.实现接口的方式多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形
3.如果需要访问当前线程,必须调用Thread.currentThread方法
4.继承Thread类的线程类不能再继承其他父类(java单继承决定)
因此,一般推荐采用实现接口的方式来创建线程。

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值