博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么在创建线程时,更推荐用实现Runnable接口的方法?而不是继承Thread类的方法?
阅读量:2056 次
发布时间:2019-04-28

本文共 1439 字,大约阅读时间需要 4 分钟。

一、继承Thread类,造Thread子类,造这个子类的对象即线程对象

内部类写法:(内部类MyThread继承Thread类,给MyThread创建对象,这个对象是线程对象)

Thread t1 = new MyThread();class MyThread extends Thread(){
@Override public void run(){
想执行的任务代码 }}

匿名内部类写法:

Thread t1 = new Thread(){
@Override public void run(){
想执行的任务代码 }}

(不存在lamda写法,因为lamda是实现接口,而且是仅有一个函数的接口)

启动线程

t1.start();

二、实现Runnable接口,创建Runnable任务对象,当作Thread有参构造器的参数

内部类写法:(内部类MyRunnable实现Runnable接口,给MyRunnable创建对象,这个对象是任务对象)

Runnable task2 = new MyRunnable();class MyRunnable implements Runnable(){
@Override public void run(){
想执行的任务代码 }}

匿名内部类写法:

Runnable task2 = new Runnable(){
@Override public void run(){
想执行的任务代码 }}

lamda写法:

Runnable task2 = () -> {
想执行的任务代码 }

把任务对象task2当作参数给Thread构造器:

Thread t2 = new Thread(task2, "t2");//给线程起名儿

启动线程:

t2.start();

三、为什么更推荐创建Runnable实现类对象,作为参数给到Thread?

看源码发现:

1、Thread是Runnable的实现类,且在Thread类中的run()就是调用target的run(),target对象Thread有参构造器的参数,是Runnable的一个对象。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、Runnable接口中只有一个方法run()方法。

在这里插入图片描述

所以:

法一:Thread子类直接重写Thread()中的run()方法
法二:Runnable实现类(对象)重写Runnable的run()方法,Thread调用这个方法

法一的局限性在于:该类继承了Thread类,就不能继承其他类了,不满足实际的需求。所以更推荐法二,将想要多线程执行的任务写进Runnable实现类对象的run()方法中,而且可以有很多个Runnable实现类对象。

其他一些说法(不是完全理解):

1、法一把线程和任务合并在了一起,法二分开了
2、Runnable更容易与线程池等高级API配合,建议操作任务对象,不建议直接操作线程对象。
3、Runnable让任务脱离了Thread继承体系,更灵活。Java中,组合优于继承,Runnable和Thread的关系是组合的,而法一是继承关系。

参考:

https://blog.csdn.net/qq_36877577/article/details/64905490
https://www.bilibili.com/video/BV16J411h7Rd?p=14

你可能感兴趣的文章
php页面meta头设置
查看>>
指针函数和函数指针的区别
查看>>
empty方法
查看>>
What does ‘composer dump-autoload’ do in Laravel?
查看>>
在win7系统中使用nodejs在WebStrom下配置socket.io
查看>>
caffe:用自己的图像数据训练模型
查看>>
ubuntu下clion中配置opencv的CMakeLists.txt
查看>>
什么是卷积 卷积有什么用
查看>>
有趣的机器学习概念纵览:从多元拟合,神经网络到深度学习,给每个感兴趣的人
查看>>
K-近邻算法:KNN
查看>>
solver及其配置
查看>>
图说C++对象模型:对象内存布局详解
查看>>
【Java基础】Java类的加载和对象创建流程的详细分析
查看>>
JAVA多线程之volatile 与 synchronized 的比较
查看>>
Java多线程知识点总结
查看>>
Java集合框架知识梳理
查看>>
java中IO流知识梳理
查看>>
word2010如何保持在公式后面键入空格后或添加文字不变小?
查看>>
笔试题(一)—— java基础
查看>>
笔试题(二)—— sql语句
查看>>