Java多线程详解(上)——2023/11/23

Process(进程)与Thread(线程)

  • 说起进程,就不得不说下程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
  • 进程则是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位
  • 通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的单位

注意:很多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的很快,所以就会有同时执行的错局

线程的创建(Thread Rannable Callable)

Thread

  • 自定义线程类继承Thread类
  • 重新run()方法编写线程执行体
  • 创建线程对象,调用start()方法启动线程

创建线程方式一:继承Thread类,重写run方法,调用start开启线程

public class TestThread1 extends Thread{
    //继承Thread 重写run方法
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 2000; i++) {
            System.out.println("重写run方法0----"+i);
        }
    }
    //main线程主线程
    public static void main(String[] args) {
        //创建一个线程对象
        TestThread1 testThread1=new TestThread1();
        //调用start开启线程
        testThread1.start();
        
        //testThread1.run();
        for (int i = 0; i < 2000; i++) {
            System.out.println("main主线程----"+i);
        }
    }
}

在这里插入图片描述

总结:注意线程开启不一定立即执行,由CPU调度安排
调用start开启新的线程执行
调用run只有一条主线程依次执行

Rannable

  • 定义MyRannable类实现Rannable接口
  • 实现run()方法,编写线程执行体
  • 创建线程对象,调用start()方法启动线程
public class TestThread3Runnable implements Runnable {
    //实现Runnable方法run
    @Override
    public void run() {
        for (int i = 0; i < 200; i++) {
            System.out.println("继承Runnable----"+i);
        }
    }
    //主方法
    public static void main(String[] args) {
        //创建runnable接口的实现类对象
        TestThread3Runnable runnable=new TestThread3Runnable();
        //创建线程对象,通过线程对象开启我们的线程,(代理)
//        Thread thread=new Thread(runnable);
//        thread.start();
        //可简写为如下
        new Thread(runnable).run();
        for (int i = 0; i < 1000; i++) {
            System.out.println("主方法****"+i);
        }
    }
}

小结

  • 继承Thread类
    • 子类继承Thread类具备多线程能力
    • 启动线程:子类对象.start()
    • 不建议使用:避免OOP单继承的局限性
  • 实现Runnable接口
    • 实现接口Runnable具有多线程能力
    • 启动线程:传入目标对象+Thread对象.start()
    • 推荐使用:避免单继承局限性,灵活方便同一个对象被多个线程使用
//一份资源
 TestThread3Runnable runnable=new TestThread3Runnable();
        //多个代理
        new Thread(runnable,"AA").run();
        new Thread(runnable,"BB").run();
        new Thread(runnable,"CC").run();

多线程06:初识多并发问题

案例
多线程(mutilthreading)操作同一个对象
异常:多个线程操作同一个对象发现问题,线程不安全,数据紊乱

public class TicketCase implements Runnable{
    //Case ticket
    //scramble for ticket
    private  int ticketNumber=10;
    @Override
    public void run() {
        while (true){
            if (ticketNumber<=0){
                break;
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(Thread.currentThread().getName()+"---->买到了第---->"+ticketNumber--+"票");
        }
    }
    public static void main(String[] args) {
        TicketCase ticketCase=new TicketCase();
        new Thread(ticketCase,"AAA").start();
        new Thread(ticketCase,"BBB").start();
        new Thread(ticketCase,"CCC").start();
    }
}

多线程:07Case Race龟兔赛跑案例

//实现龟兔赛跑
public class Race implements Runnable{
    private static String winner;//胜利
    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            boolean iswinner = judgeGame(i);
            if (iswinner){
                break;
            }
            //判断比赛是否结束
            System.out.println(Thread.currentThread().getName()+":已经跑了"+i+"步");
        }
    }
    //跑步方法
    public boolean judgeGame(int i){
        if (winner!=null){//判断是否100 直接结束游戏
            return true;
        }else {
            if (i>=100){
                winner=Thread.currentThread().getName();
                System.out.println(Thread.currentThread().getName()+"---->已经胜利了---->"+i);
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Race race=new Race();
        new Thread(race,"AAAAA").start();
        new Thread(race,"CCCCC").start();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么C语言用int *a 来声明指针变量,而不是int a声明?

为什么C语言用int *a 来声明指针变量&#xff0c;而不是int &a声明&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C语言从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c…

关系型数据库的数据隔离级别Read Committed与Repeatable Read

一、背景 数据库隔离级别会影响到我们的查询&#xff0c;本文试图以生产中的示例&#xff0c;给你一个直观的认识。 所谓&#xff0c;理论要结合实践&#xff0c;才能让我们理解得更加透彻。 另外&#xff0c;隔离级别的知识面很大&#xff0c;本文也不可能俱全&#xff0c;…

华为云RDS通用型(x86) vs 鲲鹏(ARM)架构的性能对比

概述 之前&#xff0c;我们对比了阿里云RDS的经济版&#xff08;ARM&#xff09;与x86版的性价比&#xff0c;这次我们来看看华为云的RDS MySQL的“通用型”(x86)与“鲲鹏通用增强型”(ARM)版本的情况如何。 这里依旧选择了用户较为常用的4c16g的规格进行测试&#xff0c;测试…

解读JetBrains 2023年开发者生态报告,MySQL仍是全球数据库顶流 | StoneDB数据库观察 #11

作者&#xff1a;宇亭 ​最近&#xff0c;全球知名的开发者工具公司 JetBrains 对外发布了《2023 年开发者生态系统报告》&#xff0c;报告的具体内容&#xff0c;前几天已经有中文互联网的媒体解读了&#xff0c;由于我们是做数据库的&#xff0c;所以自然而然想要特别关注一下…

模拟版图快速画图参考——《版图基础入门图解版》

模拟版图是IC行业门槛比较低的一个岗位&#xff0c;近年来有很多同学通过模拟版图来进入IC行业&#xff0c;本科生甚至是专科生都有这个机会。 学习模拟版图可能会有一些挑战&#xff0c;但通过系统性的学习、实践和逐步提升难度&#xff0c;今天为大家推荐一本经典的模拟版图…

c语言怎么“简单”表示9个变量互不相等?

c语言怎么“简单”表示9个变量互不相等? 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C语言从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff0…

考研失利后,我是如何零基础转行测试开发 ,成功拿下独角兽公司offer?

想当年&#xff0c;从一个什么都不懂的非科班测试小白&#xff0c;考研失利后&#xff0c;转行到K12教育知名互联网公司做测试开发工程师&#xff0c;我用了大概半年的时间。 这个过程中我自己也摸索出了一条学习路线&#xff0c;在这里想给大家分享一下我的学习路线&#xff…

【Node.js】笔记梳理 8 - API和JWT

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

uniapp踩坑之项目:使用过滤器将时间格式化为特定格式

利用filters过滤器对数据直接进行格式化&#xff0c;注意&#xff1a;与method、onLoad、data同层级 <template><div><!-- orderInfo.time的数据为&#xff1a;2023-12-12 12:10:23 --><p>{{ orderInfo.time | formatDate }}</p> <!-- 2023-1…

【算法】Boyer-Moore 算法

目录 1.概述1.1.Boyer-Moore 算法介绍1.2.坏字符规则表1.3.好后缀规则表1.4.总结 2.代码实现3.应用 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 有关字符串模式匹配的其它算法&#xff1a; 【算法】Brute-Force 算法 【算法】KMP 算法 【算法】Rabin-Karp …

Mac电脑vm虚拟机 VMware Fusion Pro中文 for mac

VMware Fusion Pro是一款功能强大的虚拟机软件&#xff0c;适用于需要在Mac电脑上运行其他操作系统的用户。它具有广泛的支持、快速稳定的特点以及多种高级功能&#xff0c;可以满足用户的各种需求和场景。 多操作系统支持&#xff1a;VMware Fusion Pro允许在Mac电脑上运行多…

合理的从度设置参数

环境&#xff1a;主库双1模式 一。单SQL线程 1.pos模式 1.1 position mode 模式&#xff08;最安全&#xff09; master_info_repository table relay_log_info_repository table recovery_relay_log off sync_master_info 1 sync_relay_log 1 sync_relay_log_in…

完善根文件系统

一. 简介 本文完善之前创建的根文件系统。 上一篇文章通过 设置 bootargs参数&#xff0c;使开发板通过 nfs服务从 ubuntu系统加载根文件系统。文章地址如下&#xff1a; 根文件系统初步测试-CSDN博客 二. 完善根文件系统 上一篇文章通过 设置 bootargs参数&#xff0c;使…

C++笔试题之回文数的判断

“回文”是指正读反读都能读通的句子&#xff0c;它是古今中外都有的一种修辞方式和文字游戏&#xff0c;如“我为人人&#xff0c;人人为我”等。在数学中也有这样一类数字有这样的特征&#xff0c;成为回文数&#xff08;palindrome number&#xff09;。 设n是一任意自然数…

创意设计利器:分享六款最佳的平面设计软件

1. 即时设计 即时设计是一种基于云的在线协作设计工具&#xff0c;具有原型、设计、交付、管理等全栈能力&#xff0c;对于个人及中小团队永久免费&#xff0c;至今已成为越来越多设计师的首选。 矢量编辑&#xff1a;即时设计允许用户创建、编辑和操纵矢量图形。它提供了各种…

外包干了4年,技术退步明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

基因组变异注释 — ANNOVAR(一)

基因组变异注释 — ANNOVAR&#xff08;一&#xff09; 1 简介 ANNOVAR 是一款高效的基因组注释工具&#xff0c;专门用于分析和注释来自多种生物基因组&#xff08;包括人类的 hg18、hg19、hg38&#xff0c;以及小鼠、蠕虫、果蝇、酵母等&#xff09;的遗传变异。这个工具实际…

【工作生活】汽车电子嵌入式开发简介

目录 1. 目标 2. 要分享什么 3.1 行业知识 3.1.1车载行业知识&#xff1a; 3.1.2项目&#xff1a; 3.1.3开发测试工具&#xff1a; 3.2 硬件平台 3.3 基础知识 3.4 工作生活 3. 我们是谁 1. 目标 随着新能源汽车的快速崛起&#xff0c;汽车电子行业开始快速发展&…

iEnglish:家长陪伴助力养成阅读兴趣与坚持习惯

日前,一则10岁男孩子铮连续进行英语原版阅读超过940天的打卡视频在短视频平台刷屏,评论区成为家长热议互动的平台,高赞评论包括“孩子是如何做到愿意阅读的?”“口语太棒了!”“别人家的孩子就是优秀!”“求子铮妈妈分享经验”等等。 子铮妈妈对于自己孩子的优秀也是十分开心…

通达信指标公式19:龙虎榜股票池——主力控盘度的计算方法

0.小红牛本指标&#xff0c;选股的思路说明&#xff1a;控盘度&#xff0c;又称主力控盘&#xff0c;是指主力控制了某只股票的大部分流通股&#xff0c;从而控制了股票的价格。主力控盘的目的通常是为了获取更多的收益&#xff0c;通过控制股票价格来实现其策略。所以首要分析…