当前位置: 首页 > news >正文

Thread和Runnable的区别和匿名内部类方式实现线程的创建

Thread和Runnable的区别

如果一个类继承Thread,则不适合资源共享。但如果实现了Runnable接口的话,则很容易实现资源共享。

总结:

实现Runnable接口比继承Thread类所具有的优势:

1.适合多个相同的程序代码的线程去共享一个资源。

2.可以避免Java中的单继承的局限性。(一个子类只能继承一个父类,类继承了Thread类就不能继承其它的类。而实现了Runable接口,还可以继承其他的类,实现其他的接口。

3.增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。(实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦),实现类中重写了run方法用来设置线程任务,而创建Thread类对象调用start方法只是用来开启新的线程。)

4.线程池只能放入Runable或Callable类线程,不能直接放入继承Thread的类。

扩充:在Java中,每次程序运行至少启动2个线程。一个使main线程,一个是垃圾收集线程。因为每当使用Java命令行执行一个类的时候,实际上都会启动一个JVM,每一个JVM其实都是在操作系统中启动了一个进程。

 

匿名内部类方式实现线程的创建:

使用线程的匿名内部类方式,可以方便地实现每个线程执行不同的线程任务操作。

使用匿名内部类的方式实现啊Runnable接口,重写Runnable接口中的run方法:

 

public static void main(String[] args) {
    // 常规做法:1.实现接口,2.创建实现类对象,3.调用实现类方法
    // RunableImpl impl = new RunableImpl();
    // impl.run();
    // 匿名内部类
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                System.out.println(Thread.currentThread().getName() + "-->" + i);
            }
        }
    }; // 不要忘记分号
    new Thread.start();

    for (int i = 0; i < 20; i++) { // 主线程
        System.out.println(Thread.currentThread().getName() + "-->" + i);
    }
}

或:

// 1.Thread父类
new Thread(){
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}.start();

相关文章:

  • 线程安全
  • 数据结构基本概念和术语
  • 线程状态
  • Object类中wait带参方法和notifyAll方法
  • File类
  • 递归(斐波那契数列、类加、累乘、打印多级目录)
  • FileFilter过滤器
  • LeetCode两数之和
  • 稀疏数组
  • 队列
  • 单链表LinkedList的增删改查
  • 双向链表和环形链表(单向和双向)约瑟夫环实例
  • IO流概述+字节输出流
  • 字节输入流
  • 字符流(字符输入流和字符输出流)
  • [译]前端离线指南(上)
  • 《深入 React 技术栈》
  • JAVA 学习IO流
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从输入URL到页面加载发生了什么
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 简单实现一个textarea自适应高度
  • 简析gRPC client 连接管理
  • 面试总结JavaScript篇
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 思维导图—你不知道的JavaScript中卷
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 小试R空间处理新库sf
  • 原生 js 实现移动端 Touch 滑动反弹
  • 正则与JS中的正则
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • (2)MFC+openGL单文档框架glFrame
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (ZT)出版业改革:该死的死,该生的生
  • (排序详解之 堆排序)
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***详解账号泄露:全球约1亿用户已泄露
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .Net的C#语言取月份数值对应的MonthName值
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter