7:Multithreading-Java API 实战(上)

简介: 7:Multithreading-Java API 实战

1. 问题的提出


一台计算机为何能够执行多个程序?它们是怎么执行多个程序的?


  • 电脑可以同时做很多事情,一边聊天,一边听歌,一边上网查资料等


  • 原因是电脑有多个核心(脑子),一个核心可以做一件事情,多个核心就可以做多件事情


  • 而多线程就是一台电脑,CPU可以同时运行两个程序(表面上),实际上是进程切换的快,第一个进程打开,第二个进程挂起,给你一种错觉



例如CPU的6核12线程,就相当于有6个工人去运行进程



2. 核心数、进程、线程


  • 一个核心下有多个进程,而一个进程下又会有多个线程


3. 进程和线程的区别以及对应应用


进程和线程的区别


  • 线程只是一个进程中不同执行的路径


  • 进程与进程之间不会相互影响,因为它们是占有独立内存的


  • 而线程是占用共同的内存,所以一个线程出问题,那这个进程下的线程都会出问题


  • 多进程的程序要比多线程的程序健壮,而多线程运行效率更高,但是线程不能独立执行,必须依存在应用程序中,操作系统不会把线程看作多个独立应用


  • 但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。例如很多人共同抢一双鞋,就要用到多线程


并发与并行


  • 并发(Concurrent)指一个CPU需要进行多个进程,这样就需要不停的切换,让进程不断的交替执行


  • 并行(Parallel)指多个CPU同时执行多个进程


4. 多线程程序含义、多线程的作用


创建多线程DemoThread类,Alt+Insert调出Generate选择Override Methods



选择run():void



mainThreadDemoThread两个字符串交替执行



如果用.run()的话会出现问题,死循环一直在跑,用.start()可以多开启一个线程,然后去自动调用.run(),再继续进行当前线程



显示的结果是两个死循环的内容在交替执行,其原因就是使用了.start()后两个线程一直在执行


5. 多线程的执行过程


多线程的执行方式


  • 一般的程序是从main出发,直线向下进行,只有一条主线


  • 多线程在main主线程序遇到线程程序时会转到线程程序,并返回到主线程序中,这样main程序和线程程序同时执行



6. Runnable


前面我们创建线程单继承了Thread,无法继承别的类,因为Java不支持多继承

使用Runable接口来创建线程,要使用其方法,必须创建Thread对象实现



Ctrl + 左键查看Thread源码



源码中,Thread类就是实现了Runnable接口,而在Thread的构造方法中也有许多方法函数需要传递Runnable接口类型



而我们在主函数中实现的应该是第一种传递方式,Thread的构造方法还有很多方式,这些构造函数都有一个特点就是全部使用init这个方法对线程进行实现


init源码的变量注释及源码


  • 在原始的init中名字是不能为空的,如果名字为空会报空指针异常,但是在其他的函数中,如果程序员不给thread.name赋值的话也可以自动生成一些值


  • 涉及线程组相关的安全问题


  • 变量的赋值和其他函数的初始化相关




下面init方法是对上面的函数的衍生,是构造方法中使用的初始方法



7. 简化操作以及线程名


Thread源码里面有传线程名的构造方法,要在原来线程类中自动获取我们在主线程中设置的名字,使用Thread.currentThread().getName()方法,.currentThread()是指当前线程,.getName()是指获取名字



8. 抢购鞋——多线程案例


两种创建线程的方式,一种使用继承,一种使用接口实现,解决了线程名的问题,接下来我们模拟一个多线程的抢鞋程序


抢鞋的逻辑代码涵盖在线程当中,假设有10双鞋,有三个人来抢,一个线程就是一个用户,所以这就有三个名称不一样的线程名


使用Runnable接口创建



9. 后台、守护进程的提出


电脑任务管理器


  • Apps是前台进程,Background processes是后台进程也叫守护进程,这些进程在电脑开机时就被启动,这样电脑才能正常且安全的运作起来,在程序中也是同理


  • 与进程同理,前台线程为用户提供服务,也有后台线程为前台线程提供的服务进行保护或者守护



后台线程的创建过程


  1. 创建一个DaemonThread,实现Runnable接口


  1. 重写run()方法


  1. 在运行类中创建先一个DaemonThread,再用 Thread 用来实现DaemonThread


  1. 最后调用setDaemon(true) 设置成后台守护线程,.start()开启线程



目录
相关文章
|
2月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
26天前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
27天前
|
缓存 自然语言处理 API
阿里巴巴国际站关键字搜索 API 实战:3 步搞定多语言适配 + 限流破局,询盘量提升 40%
跨境电商API开发常陷合规、多语言、限流等坑。本文详解从国际合规(GDPR/CCPA)到参数优化、数据结构化及区域化搜索的全链路方案,附Python代码模板与缓存重试架构,助力提升调用成功率至99%+,精准询盘增长42%。
|
1月前
|
安全 Java 开发者
告别NullPointerException:Java Optional实战指南
告别NullPointerException:Java Optional实战指南
227 119
|
1月前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
Python API接口实战指南:从入门到精通
|
2月前
|
数据采集 缓存 API
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
本文详解小红书笔记详情API的开发对接、实战场景与收益模式,涵盖注册避坑、签名生成、数据解析全流程,并分享品牌营销、内容创作、SAAS工具等落地应用,助力开发者高效掘金“种草经济”。
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
|
1月前
|
开发者 API 机器学习/深度学习
淘宝 / 1688 / 义乌购图搜 API 实战指南:接口调用与商业场景应用
本文详解淘宝、1688、义乌购三大平台图片搜索接口的核心特点、调用流程与实战代码。涵盖跨平台对比、参数配置、响应解析及避坑指南,支持URL/Base64上传,返回商品ID、价格、销量等关键信息,助力开发者快速实现商品识别与比价功能。
淘宝 / 1688 / 义乌购图搜 API 实战指南:接口调用与商业场景应用
|
2月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
874 8
|
2月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
399 12
|
30天前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。