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方法@Overridepublic 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@Overridepublic 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 ticketprivate  int ticketNumber=10;@Overridepublic 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;//胜利@Overridepublic 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();}
}

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

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

相关文章

基于微服务架构的外卖系统源码开发

在当前互联网时代&#xff0c;外卖行业蓬勃发展&#xff0c;用户对于高效、智能的外卖服务需求不断增加。为了满足这一需求&#xff0c;采用微服务架构的外卖系统成为了开发的主流方向。本文将探讨基于微服务的外卖系统源码开发&#xff0c;涉及到关键技术和示例代码。 1. 微…

伪原创软件盘点,文本处理事半功倍

在工作中&#xff0c;我们常常需要处理大量的文字信息&#xff0c;无论是写作、编辑还是其他文本相关的工作。有时候&#xff0c;为了提高效率&#xff0c;我们可能会需要一些伪原创软件&#xff0c;它们可以帮助我们巧妙地改写文本&#xff0c;使之保留原意的同时呈现出全新的…

Nacos前世今生、安装配置、服务注册源码、整合Springboot实战

一、前言 随着微服务架构的兴起&#xff0c;服务的规模不断增长&#xff0c;对于服务的发现、配置和管理变得越来越复杂。 在这个背景下&#xff0c;Nacos应运而生&#xff0c;以其强大的功能和灵活性成为云原生领域的瑞士军刀之一。 Nacos是一个由阿里巴巴开源的项目&#…

在Spring Cloud中使用组件Zuul网关,并注册到Eureka中去

在上一篇中&#xff0c;我们搭建了Spring Cloud的父子模块&#xff0c;并实现了一个Eureka子模块的启动&#xff0c;可以通过浏览器地址去访问Eureka主页了&#xff0c;相信了解过的童鞋应该看到&#xff0c;主页上并未有任何服务去注册&#xff0c;那么我们就在这篇&#xff0…

字节跳动开源基于SD1.5的 MagicAnimate 一张照片秒变真人舞蹈视频

从今天起&#xff0c;在社交平台上看到的小姐姐舞蹈短视频很可能就是AI生成的。字节跳动新开源基于SD1.5的MagicAnimate&#xff0c;它只需要一张照片和一组动作&#xff0c;就能生成近似真人的舞蹈视频。 项目地址&#xff1a;MagicAnimate使用入口地址 Ai模型最新工具和软件a…

linux部署前端页面(实战)

Linux基本命令&#xff08;学习笔记&#xff09;零基础入门linux系统运维_linux find exec rm_Z_Xshan的博客-CSDN博客 如果linux不熟可以看我之前写的入门教程 感谢支持&#xff01;&#xff01; 一、服务器 这里去购买云服务器&#xff0c;如果是练习可以用虚拟机&#xff…

一文看懂 Linux 内核,清晰明了

Linux内核预备工作 理解Linux内核最好预备的知识点&#xff1a;懂C语言 懂一点操作系统的知识 熟悉少量相关算法 懂计算机体系结构 Linux内核的特点&#xff1a; 结合了 unix 操作系统的一些基础概念。 Linux内核的任务&#xff1a; 1. 从技术层面讲&#xff0c;内核是硬…

ESP32 LVGL Gui-Guider的移植

使用参考&#xff1a; ESP32系列之LVGL&#xff08;三&#xff09;&#xff1a;Gui-Guider的使用_esp32 lvgl-CSDN博客 1、拷贝文件&#xff1a; 按照上面的文章&#xff0c;使用Gui-Guider软件生成C代码之后&#xff0c;custom和generated是我们要使用到的文件&#xff0c;…

阿里云服务器租赁价格表,预算100元到5000元可选配置

阿里云服务器租用费用&#xff0c;阿里云轻量应用服务器2核2G3M带宽轻量服务器一年87元&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;ECS云服务器e系列2核2G配置3M固定带宽99元一年、2核4G配置365元一年、2核8G配置522元一年&#xff0c;阿里云u1服务器2核4G、…

成为Java开发高手:掌握Spring框架的关键技能-DI

DI相关内容 1.1 setter注入1.1.2 注入引用数据类型1.1.3 注入简单数据类型步骤1:声明属性并提供setter方法步骤2:配置文件中进行注入配置步骤3:运行程序 1.2 构造器注入1.2.2 构造器注入引用数据类型步骤1:删除setter方法并提供构造方法步骤2:配置文件中进行配置构造方式注入步…

最优化理论复习--凸集与凸函数

文章目录 基本概念凸集凸函数下一篇 基本概念 可行点&#xff08;可行解&#xff09;&#xff1a;在规划问题中&#xff0c;满足约束条件的点可行集或可行域&#xff1a;全体可行点组成的集合无约束问题&#xff1a;如果一个问题的可行集是整个空间。 分为三种情况&#xff1…

甘草书店记:6# 2023年10月31日 星期二 「梦想从来不是一夜之间实现的」

甘草书店 今天收到甘草书店第二版装修设计平面图&#xff0c;与理想空间越来越近。 于我而言&#xff0c;每一次世俗意义上所谓的成功都不如文艺作品中表现的那样让人欢腾雀跃。当你用尽120分努力&#xff0c;达到了冲刺满分的实力时&#xff0c;得个优秀的成绩也并不意外。 …

华为云obs在java中的使用

1、申请obs服务。 申请完成后&#xff0c;会获得以下几个配置信息&#xff1a; AK"****************************"; SK"******************************************************"; ENDPOINT"obs.*************************"; BUCKET_NAME&q…

二维码智慧门牌管理系统升级解决方案:优化制牌存疑管理

文章目录 前言一、解决方案关键特点二、解决方案的优势 前言 二维码智慧门牌管理系统在城市管理中发挥着重要作用&#xff0c;然而&#xff0c;制牌审核过程中遇到存疑地址数据是常见问题&#xff0c;需要更有效的处理方法。为此&#xff0c;我们提出了二维码智慧门牌管理系统…

Swift 如何实现自定义 Tab Bar

前言 每个 UI 设计师都喜欢美丽而有动画效果的 Tab Bar。然而&#xff0c;对于开发人员来说&#xff0c;实现这种设计可能是一场噩梦。当然&#xff0c;使用 Apple 的原生 Tab Bar 组件并专注于更有趣的事情&#xff0c;比如业务逻辑的实现&#xff0c;会更容易。但如果我们必…

用金鸣识别实现纸质合同转word的几个解决方案

合同是我们日常生活和工作中经常碰到的文件类型&#xff0c;如果您需要将纸合同转为可编辑的Word文档怎么办呢&#xff1f; 如果是一般无表格的合同比较好处理&#xff0c;一般的OCR软件都能应付&#xff0c;只是识别率高低的问题&#xff08;好的OCR识别率高&#xff0c;后期…

用js自定义一个(v-model)vModel双向绑定函数

vue中的v-model是双向绑定的, 我们自己用JavaScript实现一个双向绑定vModel函数。 // element 元素或者#id,.class,div 得是input标签 // data 对象 // 将要绑定property 对象中的key<input class"vmodel"/>function vModel(element, data, property) {if (…

优雅草蜻蜓I即时通讯·水银版私有化部署之java服务端搭建教程-01

目录 前言1 1 安装 mongodb2 2 安装 redis3 3. 安装jdk3 4 解压 spring-boot-imapi3 5.开始安装 消息队列组件 rocket4 6. 安装推送服务5 7. 安装 message-push5 8. 安装uplooad 服务5 9&#xff1a; 安装nginx 服务7 1.不需要SSL7 2.需要SSL7 五&#xff1a;编译…

LORA概述: 大语言模型的低阶适应

LORA概述: 大语言模型的低阶适应 LORA: 大语言模型的低阶适应前言摘要论文十问实验RoBERTaDeBERTaGPT-2GPT-3 结论代码调用 LORA: 大语言模型的低阶适应 前言 LoRA的核心思想在于优化预训练语言模型的微调过程&#xff0c;通过有效地处理权重矩阵的变化&#xff08;即梯度更新…

常用sql记录

备份一张表 PostgreSQL CREATE TABLE new_table AS SELECT * FROM old_table;-- 下面这个比上面好&#xff0c;这个复制表结构时&#xff0c;会把默认值、约束、注释都复制 CREATE TABLE new_table (LIKE old_table INCLUDING ALL) WITHOUT OIDS; INSERT INTO new_table SELE…