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

news2024/11/16 23:49:35

多线程

2 线程创建

2.2 实现Runnable接口

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

  • 定义MyRunnable类实现Runnable接口
  • 实现run()方法,编写线程执行体
  • 创建线程对象,调用start()方法启动线程
package com.duo.demo01;

//创建线程方式二:实现Runnable接口,重写run方法,执行线程需传入runnable接口实现类再调用start方法
public class ThreadTest3 implements Runnable {
    @Override
    public 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;

    @Override
    public 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.coloradmin.cn/o/1250588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式事务,一致性理论, 两阶段提交(2PC), 三阶段提交(3PC),Seata分布式事务方案

文章目录 分布式事务&#xff1a;1、一致性理论2、两阶段提交&#xff08;2PC&#xff09;3、三阶段提交&#xff08;3PC&#xff09;4、Seata分布式事务方案 上一篇降到了 分布式锁&#xff0c;先来和大家聊一聊分布式事务&#xff0c; 分布式锁的链接如下&#xff1a; http…

位图的详细讲解

位运算操作符&#xff1a;或&#xff0c;与&#xff0c;异或&#xff0c;按位取反。 操作符 |两个中有一个是一则为一&两个都是一则为一^相同为零&#xff0c;不同为一~零变成一&#xff0c;一变成零 什么是位运算符: 位运算是直接对整型数据的二进制进行运算。 位图概念…

物流公司打印用什么软件,佳易王物流运单打印管理系统软件下载

物流公司打印用什么软件&#xff0c;佳易王物流运单打印管理系统软件下载 软件特色&#xff1a; 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff0c;已内置数据库。 2、物流开单打印&#xff0c;可以打印两联单或三联单&#x…

X-RAY POC编写

POC(Proof of Concept) - 利用证明 POC&#xff0c;Proof of Concept&#xff0c;意思是 利用证明。这个短语会在漏洞报告中使用&#xff0c;漏洞报告中的POC则是一段说明或者一个攻击的漏洞介绍&#xff0c;使得读者能够确认这个漏洞是真实存在的。 EXP(Exploit) - 漏洞利用…

GDPU 数据结构 天码行空11

文章目录 数据结构实验十一 图的创建与存储一、实验目的二、实验内容三、【实验源代码】&#x1f37b; CPP版&#x1f37b; c 语言版&#x1f37b; java版 四、【实验结果】五、【实验总结】 数据结构实验十一 图的创建与存储 一、实验目的 1、 理解图的存储结构与基本操作&a…

【STM32】新建工程

学习来源&#xff1a;[2-2] 新建工程_哔哩哔哩_bilibili 目前STM32的开发主要有基于寄存器的开发方式、基于标准库也就是库函数的方式和基于HAL库的方式。本学习是基于库函数的方式。&#xff08;各种资料去百度云下载&#xff09; 1 建立工程文件夹 Keil中新建工程&#xf…

高性能Mysql第三版学习(一)

学习目标&#xff1a; 高性能Mysql第3版 学习内容&#xff1a; MySQL架构与历史Mysql基座测试服务器性能Schema与数据类型优化创建高性能的索引查询性能优化Mysql高级特性Explain 学习时间&#xff1a; 周一至周五晚上 9点—晚上10点周六晚上9点-10点周日晚上9 点-10点 学习…

公众号留言功能还有可能开放吗?

为什么公众号没有留言功能&#xff1f;2018年2月12日&#xff0c;TX新规出台&#xff1a;根据相关规定和平台规则要求&#xff0c;我们暂时调整留言功能开放规则&#xff0c;后续新注册帐号无留言功能。这就意味着2018年2月12日号之后注册的公众号不论个人主体还是组织主体&…

初出茅庐的小李博客之C语言必备知识共用体

C语言必备知识共用体 共用体是一种构造数据类型&#xff0c;有时候也称之为联合体。 它的用途&#xff1a; 使几个不同类型的变量共占一段内存。 共用体举例 union 共用体名 { 类型标识符 成员名;类型标识符 成员名; };union data //共用体名字是data{ int i; …

面试题:什么是自旋锁?自旋的好处和后果是什么呢?

文章目录 什么是自旋自旋和非自旋的获取锁的流程 自旋锁的好处AtomicLong 的实现实现一个可重入的自旋锁示例自旋的缺点适用场景 什么是自旋 “自旋”可以理解为“自我旋转”&#xff0c;这里的“旋转”指“循环”&#xff0c;比如 while 循环或者 for 循环。“自旋”就是自己…

初学剪辑者找视频素材就上这6个网站

视频剪辑必备的6个素材网站&#xff0c;高清无水印&#xff0c;还可以免费下载&#xff0c;无版权限制&#xff0c;赶紧收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要以设计类素材为主&#…

宝塔 Linux 面板安装一个高大上的论坛程序 —— Flarum

这个是很早搭建的版本,基于宝塔面板,比较复杂,如果想要简单的搭建方法,可以参看咕咕新写的这篇: 【好玩的 Docker 项目】10 分钟搭建一个高大上的论坛程序 购买腾讯云轻量应用服务器 待补充 登录服务器 待补充 BBR 加速脚本 BBR 加速脚本: BASH cd /usr/src &…

XML映射文件

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"org.mybatis.example.BlogMapper&q…

Chatbot开发三剑客:LLAMA、LangChain和Python

聊天机器人&#xff08;Chatbot&#xff09;开发是一项充满挑战的复杂任务&#xff0c;需要综合运用多种技术和工具。在这一领域中&#xff0c;LLAMA、LangChain和Python的联合形成了一个强大的组合&#xff0c;为Chatbot的设计和实现提供了卓越支持。 首先&#xff0c;LLAMA是…

蓝牙运动耳机哪个好?蓝牙运动耳机排行榜前十名

​在运动中&#xff0c;音乐可以激发你的热情和动力&#xff0c;而一款好的运动耳机则可以让你更好地享受音乐。然而&#xff0c;市面上的运动耳机品牌和型号众多&#xff0c;质量参差不齐。所以&#xff0c;今天精选了5款市面上比较优秀的运动耳机给大家参考&#xff0c;是你运…

【开源】基于JAVA的车险自助理赔系统

项目编号&#xff1a; S 018 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S018&#xff0c;文末获取源码。} 项目编号&#xff1a;S018&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车…

Vatee万腾的科技冒险:Vatee独特探索力量的数字化征程

在数字化时代的激流中&#xff0c;Vatee万腾以其独特的科技冒险精神&#xff0c;引领着一场前所未有的数字化征程。这不仅仅是一次冒险&#xff0c;更是对未知的深度探索&#xff0c;将科技的力量推向新的高度。 Vatee万腾在科技领域敢于挑战传统&#xff0c;积极探索未知的可能…

ThreeJs实现简单的动画

上一节实现可用鼠标控制相机的方式实现动态效果&#xff0c;但很多时候是需要场景自己产恒动态效果&#xff0c;而不是通过鼠标拖动&#xff0c;此时引入一个requestAnimationFrame方法&#xff0c;它实际上是通过定时任务的方式&#xff0c;每隔一点时间改变场景中内容后重新渲…

详解:什么是“智能合同管理”

未来已来&#xff0c;行业数字化进行的如火如荼&#xff0c;并逐步驶入深水区。合同是企业开展经营活动的重要文件&#xff0c;也是风险管控的核心地带&#xff0c;做好合同管理对企业运营效率的提升至关重要。近年来&#xff0c;合同管理已经跟随企业数字化的浪潮进入转型时期…

MySQL 及 SQL 注入

文章目录 前言什么是sql注入防止SQL注入Like语句中的注入后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现…