
Java创建线程有几种方式?
Java5 之后的
那如果我既继承了
发布日期:2021-05-08 19:31:59
浏览次数:21
分类:精选文章
本文共 1771 字,大约阅读时间需要 5 分钟。
Java创建线程有几种方式?
Java 创建线程有两种方式:
1. 继承Thread
类,并重写run()
方法
Runnable
接口,覆盖接口中的run()
方法,并把Runnable
接口的实现扔给Thread
public static void main(String[] args) { // 第一种 MyThread myThread = new MyThread(); myThread.start(); // 第二种 new Thread(() -> System.out.println("自己实现的run-2")).start();}public static class MyThread extends Thread { @Override public void run() { System.out.println("自己实现的run-1"); }}
Java5 之后的Executors
,Executors
工具类可以用来创建线程池。
小哥:Executors
工具类是用来创建线程池的,这个线程池可以指定线程个数,也可以不指定,也可以指定定时器的线程池,它有如下常用的方法:
newFixedThreadPool(int nThreads):创建固定数量的线程池newCachedThreadPool():创建缓存线程池newSingleThreadExecutor():创建单个线程newScheduledThreadPool(int corePoolSize):创建定时器线程池
hread
里的run()
方法具体是怎么实现的吗?
Thread
中的run()
方法里东西很少,就一个 if 判断:
@Overridepublic void run() { if (target != null) { target.run(); }}
有个target
对象,会去判断该变量是否为空,非空的时候,去执行target
对象中的run()
方法,否则啥也不干。而这个target
对象,就是我们说的Runnable
:
Runnable
类
@FunctionalInterfacepublic interface Runnable { public abstract void run();}
这个抽象方法也是run()
!如果我们使用Runnable
接口,就需要实现这个run()
方法。由于这个Runnable
类上面标了@FunctionalInterface
注解,所以可以使用函数式编程。
假如用第一种方式:继承了Thread
类,然后重写了run()
方法,那么它就不会去执行上面这个默认的run()
方法了(即不会去判断target
),会执行我重写的run()
方法逻辑。
假如是用的第二种方式:实现Runnable
接口的方式,那么它会执行默认的run()
方法,然后判断target
不为空,再去执行我在Runnable
接口中实现的run()
方法。
那如果我既继承了Thread
类,同时我又实现了Runnable
接口,比如这样,最后会打印什么信息出来呢?
public static void main(String[] args) { new Thread(() -> System.out.println("runnable run")) { @Override public void run() { System.out.println("Thread run"); } }.start();}
“Thread run”
其实是 new 了一个对象(子对象)继承了Thread
对象(父对象),在子对象里重写了父类的run()
方法;然后父对象里面扔了个Runnable
进去,父对象中的run()
方法就是最初那个带有 if 判断的run()
方法。
好了,现在执行start()
后,肯定先在子类中找run()
方法,找到了,父类的run()
方法自然就被干掉了,所以会打印出:Thread run。
Java 语言本身的父子继承关系,会优先执行子类重写的方法而已
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年03月27日 15时46分26秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
开发小白也毫无压力的hexo静态博客建站全攻略 - 躺坑后亲诉心路历程
2021-05-09
golang基础--类型与变量
2021-05-09
.NetCore外国一些高质量博客分享
2021-05-09
解决WebRTC中不同的浏览器之间适配的问题
2021-05-09
深入理解JavaScript函数
2021-05-09
【spring源码系列】之【xml解析】
2021-05-09
(在模仿中精进数据可视化07)星球研究所大坝分布可视化
2021-05-09
(数据科学学习手札02)Python与R在循环语句与条件语句上的异同
2021-05-09
(数据科学学习手札27)sklearn数据集分割方法汇总
2021-05-09
(数据科学学习手札40)tensorflow实现LSTM时间序列预测
2021-05-09
[整理] 哪些集合类是线程安全的?(Java)
2021-05-09
8 个警示和学习的 5 个阶段
2021-05-09
c# 图片带水纹波动
2021-05-09
H5 贪吃蛇源码
2021-05-09
从零开始学安全(十六)● Linux vim命令
2021-05-09
从零开始学安全(三十四)●百度杯 ctf比赛 九月场 sqli
2021-05-09
3389连接痕迹清除
2021-05-09
发生系统错误 6118
2021-05-09
阿里巴巴Json工具-Fastjson教程
2021-05-09
Spring Cloud Gateway - 快速开始
2021-05-09