【多线程】-- 02 线程创建之实现Runnable初识多线程并发问题

多线程

2 线程创建

2.2 实现Runnable接口

【学习提示】查看JDK帮助文档

  • 定义MyRunnable类实现Runnable接口
  • 实现run()方法,编写线程执行体
  • 创建线程对象,调用start()方法启动线程
package com.duo.demo01;//创建线程方式二:实现Runnable接口,重写run方法,执行线程需传入runnable接口实现类再调用start方法
public class ThreadTest3 implements Runnable {@Overridepublic void run() {//run方法线程体for (int i = 0; i < 5; i++) {System.out.println("在写代码" + i);}}public static void main(String[] args) {//创建Runnable接口的实现类对象ThreadTest3 threadTest3 = new ThreadTest3();//创建线程对象,通过线程对象以启动线程Thread thread = new Thread(threadTest3);thread.start();//上两行代码可简写为:new Thread(threadTest3).start();for (int i = 0; i < 5; i++) {System.out.println("在看视频" + i);}}
}

运行结果:

图1

可以发现,主线程与所建线程同时执行,同样可以得出,线程开启后不一定立即执行,而由CPU调度执行

在此基础上,在上节最后的练习”实现多线程同步下载图片“中,可将主线程函数中启动线程的代码体更换为:

public class ThreadTest2 implements Runnable {public static void main(String[] args) {ThreadTest2 t1 = new ThreadTest2("https://img-blog.csdnimg.cn/a4bbb67340ce46a293b725868b3997b4.jpeg", "星空.jpg");ThreadTest2 t2 = new ThreadTest2("https://img-blog.csdnimg.cn/8dc90f70dca8437d868c655bcd0db7fc.jpeg", "黄昏.jpg");ThreadTest2 t3 = new ThreadTest2("https://img-blog.csdnimg.cn/cc83486a8a7b46a193dac95decc4ad31.jpeg", "旷野.jpg");new Thread(t1).start();  //更换后的启动线程代码new Thread(t2).start();new Thread(t3).start();}
}

注意到在第一行代码中,已将原本的继承Thread类代码public class ThreadTest extends Thread {}更新为实现Runnable接口的代码public class ThreadTest2 implements Runnable {},如此一来,原本直接调用线程对象threadTest的start()方法即threadTest.start()可简化为如上的代码体new Thread(t1).start()

实际上,这种方法来创建一个线程是通过声明实现类Runnable接口,在这个类中实现了run方法。 然后可以分配类的实例,在创建Thread作为参数传递,并启动。

【小结】

  • 继承Thread类方法

    • 子类继承Thread类具备多线程能力
    • 启动线程:子类对象.start()
    • 不建议使用,OOP单继承局限性
  • 实现Runnable接口

    • 实现接口Runnable具有多线程能力
    • 启动线程:传入目标对象 + Thread对象.start()
    • 推荐使用,避免了单继承局限性,灵活方便,方便同一个对象被多个线程使用
  • 初识并发问题

package com.duo.demo01;import static java.lang.Thread.sleep;//多个线程同时操作同一个对象
//买火车票的例子
public class ThreadTest4 implements Runnable {private int ticketNum = 10;@Overridepublic void run() {while (ticketNum > 0) {//模拟延时try {sleep(200);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "->抢到了第" + ticketNum-- + "票");}}public static void main(String[] args) {ThreadTest4 ticket = new ThreadTest4();new Thread(ticket, "ming").start();new Thread(ticket, "hua").start();new Thread(ticket, "hong").start();}
}

运行结果:

图2

可以发现,存在一个问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱 – 线程的并发问题


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/216727.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac开发环境——MacOSX安装与配置Anaconda与PyCharm详细流程

一、安装与使用Anaconda 1.简介 Anaconda 是一个用于数据科学、机器学习和科学计算的开源发行版和包管理器。有许多可用于数据处理、分析和建模的工具和库&#xff0c;并提供了一个方便的环境管理系统。Anaconda 包含了 Python 解释器和许多常用的 Python 包&#xff0c;以及…

Windows环境搭建

Windows环境搭建 一. jdk1.8安装1. 资源链接2. 安装3. 配置环境变量 一. jdk1.8安装 1. 资源链接 资源链接 提取码&#xff1a;tfms 2. 安装 1.双击下载好的JDK,点击下一步。 2.修改默认目录&#xff08;可不修改&#xff09;&#xff0c;点击下一步&#xff0c; 3. 点击下…

医保线上购药系统:引领医疗新潮流

在科技的驱动下&#xff0c;医疗健康服务正经历一场数字化的革新。医保线上购药系统&#xff0c;不仅是一种医疗服务的新选择&#xff0c;更是技术代码为我们的健康管理带来的全新可能。本文将通过一些简单的技术代码示例&#xff0c;深入解析医保线上购药系统的工作原理和优势…

CleanMyMacX4.14.5macOS电脑系统免费清理工具

CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#xff0c;修复系统漏洞&#xff0c;一键扫描和优化Mac系统&#xff0c;…

Altium Designer学习笔记13

0603电容封装的画法&#xff1a; 再画下三极管SOT-23的三极管的封装图&#xff1a; 画出三极管的封装图&#xff1a; 在画图的过程中&#xff0c;遇到了一个问题&#xff0c;画闭环线路的时候&#xff0c;就会被自动删除&#xff0c;查出是这个地方的配置需要进行修改。 那这个…

ConcurrentHashMap的数据结构+以及各个版本之间的区别

ConcurrentHashMap 1.7与1.8的区别 1、锁结构不同 2、put的流程不同 3、size的计算方式不同(1.8使用的使用basecell[]计算&#xff0c;有点类似于LongAdder&#xff0c;1.7使用三级通缉判断是否一样&#xff0c;不一样通过分段式加锁再求和) 4、数据结构不同&#xff0c;1.6 Re…

FANUC机器人到达某个点位时,为什么不显示@符号?

FANUC机器人到达某个点位时,为什么不显示@符号? 该功能由变量$MNDSP_POSCF = 0(不显示)/1(显示)/2(光标移动该行显示) 控制,该变量设置为不同的值,则启用对应的功能。 如下图所示,为该变量设置不同的值时的对比, 其他常用的系统变量可参考以下内容: 在R寄存器指定速度…

HCIA-RS基础-静态路由协议

摘要&#xff1a;静态路由是一种在网络中广泛应用的路由选择方案&#xff0c;它以其简单的配置和低开销而备受青睐。本文将介绍静态路由的配置方法、默认路由的设置、路由的负载分担和备份策略。通过学习本文&#xff0c;希望可以你能够掌握静态路由的基本概念和在华为模拟器中…

rhino 取消画线自带控制点方法~

很多朋友反映不知道 rhino 怎么取消画线自带控制点&#xff1f;下面就这个问题&#xff0c;一起来看看吧&#xff01; 软件地址&#xff1a;Rhino 8 for Mac中文下载 rhino 怎么取消画线自带控制点&#xff1f; 在Rhino中选择“线条”工具&#xff0c;或者使用快捷键“L”来…

Redis Cluster主从模式详解

在软件的架构中&#xff0c;主从模式&#xff08;Master-Slave&#xff09;是使用较多的一种架构。主&#xff08;Master&#xff09;和从&#xff08;Slave&#xff09;分别部署在不同的服务器上&#xff0c;当主节点服务器写入数据时&#xff0c;同时也会将数据同步至从节点服…

【Python3】【力扣题】349. 两个数组的交集

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;集合的交集。两个数组都转为集合&#xff0c;获取集合的交集。 知识点&#xff1a;set(...)&#xff1a;转为集合&#xff0c;集合的元素不重复。 集合1.intersection(集合2)&#xff1a…

Python是个什么鬼?朋友靠它拿了5个offer

闺蜜乐乐&#xff0c;外院科班出身&#xff0c;手持专八和CATTI证书&#xff0c;没想到找工作时却碰了钉子… 半夜12点&#xff0c;乐乐跟我开启了吐槽模式&#xff1a; 拿到offer的都是小公司的翻译活儿&#xff0c;只能糊个口。稍微好点的平台要求可就多了&#xff0c;不仅语…