线程创建方式的三种方式

三种线程创建方式

  • 继承 Thread 类重写 run 方法
  • 实现Runnable接口的run方法
  • 使用Callable和Future创建线程

继承 Thread 类重写 run 方法

线程创建方式创建过程优势劣势
继承 Thread 类重写 run 方法1)创建实例,此时该线程未被启动执行。MyThread thread= new MyThread ();
2)调用该实例的start方法启动线程 thread .start();,达到就绪状态(已经获取了除CPU资源的其他资源),等待获取CPU资源才会处于运行状态。
3)run方法执行完毕,线程处于终止状态。
1)run() 方法获取当前线程直接使用 this ,无需使用 Thread. currentThread() 方法。1)Java 不支持多继承,如果继承了 Thread 类, 那么就不能再继承其他类。
2)任务与代码没有分离,当多个线程执行一样的任务时需要多份任务代码,而 Runnable 则没有这个限制 。
3)任务没有返回值

实现 Runnable 接口 run 方法

线程创建方式创建过程优势劣势
实现Runnable 接口 run 方法1)创建实例RunableTask task =new RunableTask (),此时该线程未被启动执行。
2)使用创建的task对象作为任务创建了一个线程并启动它 new Thread(task) .start()
1)可以 RunableTask 添加参数进行任务区分,达到不共用一个task逻辑
2)可以继承其他类
1)任务没有返回值

使用Callable和Future创建线程

// 创建任务类
public stat class CallerTask implemets Callable<返回类型> {
    @Override
    public 返回类型 call() throws Exception{
        return 返回类型值;
    }
}

// 具体使用:
// 创建异步任务
FutureTask<返回类型> futureTask =new FutureTask<>(new CallerTask()) ;
// 启动线程
new Thread(futureTask).start();
// 等待任务执行完毕,并返回结果
返回类型 result = futureTask.get();

CallerTask 类实现了 Callable 接口的 call ()方法 。

  1. 在 main 函数内首先创建了FutrueTask 对象(构造函数为CallerTask 实例)
  2. 使用创建的FutrueTask 对象作为任务创建了一个线程并启动它
  3. 通过futureTask.get()等待任务执行完毕并返回结果

总结:

使用继承方式的好处是方便传参,可以在子类里添加成员变量,通过set方法设置参数或者通过构造函数进行传递。不好的是不可以继承其他类,不能拿到任务的返回结果。

使用Runnable方式,只能使用主线程里被声明为final的变量。可以继承其他类,不能拿到任务的返回结果。

使用Callable和Future方式,可以拿到任务的返回结果。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值