[零基础学JAVA]Java SE应用部分-23.多线程(01)

简介:
本季目标
image
多线程这一个部分,重点掌握以下几点(概念): 
·线程与进程的区别 
·java中多线程的实现方式及区别 
·java线程的同步与死锁
多线程的基本概念(1)
image
DOS开始的:如果一旦出现了病毒,则操作系统就会死掉,因为DOS在同一个时间段上只能有一个程序运行。 
Windows:如果出现了病毒操作系统是不是依然可以使用呢? 
但是电脑的CPU 有几个?一个?多进程是将CPU的资源进行划分,在同一个时间段上会有多个程序运行,但是在同一个时间点上只能有一个程序运行。
进程与线程的关系? 
操作系统可以有多个进程 
每个进程上会划分出多个线程 
如果进程消失了,则线程也会消失 
如果线程消失了,则进程未必会消失。
多线程的基本概念(2)
image
多线程本身还是需要操作系统支持的。也就是说使用多线程会提供资源的利用率。
JAVA线程的实现
image
image
程序依次执行线程A、线程B、线程C,好像体现不出同一个时间段上有多个程序运行哈~
image
以上代码是通过run方法调用的,没有启动多线程机制。实际上注意一点:各个操作系统都有各自的资源划分,也就是说,如果要想在一个操作系统上实现多线程程序,则肯定不能直接去调用run(类中的方法)启动,而应该告诉操作系统,由操作系统进行分配。
image
如果想要启动多线程,则肯定调用start()方法,start方法可以调用被子类覆写过的run方法
image
我们现在看下程序能否启动多线程
image
通过start()方法确实调用run方法,此时的程序确实是同时运行着,而且是交替运行,谁抢到了CPU资源,谁就运行。 
为什么非要调用start()方法启动呢?
image
image
JDK中Thread类的定义
image    
其中started是在方法中定义一个boolean变量,判断这个线程是否己被启动,如果没有启动,则执行此段代码,表示线程已经启动,线程加入就绪状态,调用start0这个私有方法,此方法表示要调用操作系统的函数。
image
native是一个关键字 
  在JAVA中有种技术:JNI(Java Native  Interface),可以使用JAVA程序调用本机操作系统的函数,以达到某些功能。
如果再次启动一个已经启动的线程,则会如何呢?
image
image 
程序会抛出一个 IllegalThreadStateException()异常 
记住:只要是线程启动一次就OK啦。
以上程序实际上也存在问题? 
  如果一个类必须继承Thread类才能实现多线程,则此类肯定就不能再继承其他的类了,即:如果使用Thread会受到单继承的局限,所以一般实现多线程都是实现Runnable接口。
image 
在Thread类的构造方法处: 
   public Thread(Runnable target) --> 表示只要是Runnable接口的子类对象都可以向里面传递。
image
image
验证下效果,多线程确实起作用了哈~
image
结论:不管那种方式实现多线程,最终永远都是通过Thread类启动多线程。
Thread类与Runnable接口(1)
image
Thread类也是实现了Runnable接口哈~
image
image
Thread类与Runnable接口(2)
image
1、避免单继承局限 
2、可以达到多个线程的资源共享
image
验证下效果哈~
image
我们发现这个程序有点问题,三个线程各占了10张票,一共卖了30张票,为什么会这样呢?因为 private int ticket = 10 ;这个属性,一旦实现了下面的代码:
MyThread mt1 = new MyThread(); 
MyThread mt2 = new MyThread(); 
MyThread mt3 = new MyThread();
执行之后就完成实例化操作,mt1、mt2、mt3各自占各自的属性,即各占有10张票,这样就没有达到资源共享。
如果我们要实现资源共享,可以修改以上程序,看下面哈~
image
现在三个对象共卖10张票,达到了资源共享的效果哈~~~
  image
如果使用了Runnable接口实现了多线程,则所有的线程对象同时占据同一个Runnable接口的子类对象,则证明多个线程共享资源。 
结论:肯定一个类实现Runnable接口实现多线程是最好的。
总结 
1、进程与线程的区别 
  · 线程是在进程基础上的划分 
  · 进程是在操作系统上的划分

2、 使用多线程可以发现在同一个时间段上所有的程序是交替运行的。

3、 多线程的实现有两种方式: 
  · 实现Runnable接口 
  · 继承Thread类

4、 联系与区别: 
   ·  Thread类也是Runnable接口的子类 
  · 如果要想启动线程,则必须把自定义的实现了Runnable接口的子类对象放入Thread类中 
  ·  Runnable接口可以实现多个资源的共享 
  · 绝对要优先使用Runnable接口,避免单继承的局限。
#################################################








本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/130994 ,如需转载请自行联系原作者
相关文章
|
2月前
|
人工智能 算法 Java
Java与AI驱动区块链:构建智能合约与去中心化AI应用
区块链技术和人工智能的融合正在开创去中心化智能应用的新纪元。本文深入探讨如何使用Java构建AI驱动的区块链应用,涵盖智能合约开发、去中心化AI模型训练与推理、数据隐私保护以及通证经济激励等核心主题。我们将完整展示从区块链基础集成、智能合约编写、AI模型上链到去中心化应用(DApp)开发的全流程,为构建下一代可信、透明的智能去中心化系统提供完整技术方案。
254 3
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
165 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
190 1
|
2月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
127 8
|
3月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
498 12
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
3月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
414 1
Java 数据库 Spring
152 0
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
270 0
|
2月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
152 6

热门文章

最新文章