【java多线程学习】多线程的基本概念
今天开始系统的学习了java多线程有关的基础知识,大致先分为三个步骤:多线程的基本概念,多线程的两种使用方法(继承Thread类、实现Runable接口),线程的同步。这里先记录下下多线程的基本概念。几篇比较好的博文 Java多线程编程总结(转载) .NET多线程编程(1):多任务和多线程 Java多线程编程详解
一:线程和进程的区别
说多线程(MultiThread)和多进程(MultiProcess)之前先说说多任务(MultiTask),我的理解是多线程和多进程都是操作系统多任务特性的一种实现方法(多线程程序在较低的层次上扩展了多任务的概念)。 早期操作系统只能只能在一段时间点执行单个任务,该任务执行完毕后在执行下一个任务,后来出现了分时操作系统。 一个CPU虽然也还是只能在一个时间点执行一条指令,但是分时操作系统将CPU的时间分成多个片段,每个任务能轮流占用一个片段。任务在其分配的时间片内没有执行完时,则进入等待队列,直到轮流分到下一个时间片。 这样的话,在宏观上看来,计算机就可以同时执行多个任务。分时的概念让并发执行的任务数目不再由CPU的数目来限制。
进程可以理解为一个系统/应用程序的启动。多进程可以直观理解为计算机在浏览网页的同时,也可以QQ聊天,也可以听音乐等。正如在进程管理器中看到的一样,每个启动的程序都有进程名与之对应。如浏览网页的chrome.exe,QQ聊天的QQ.exe,听音乐的DoubanRadio.exe等。 这样多进程在较高的程度上实现了多任务的概念。每个进程程序都有自己的堆栈空间和环境变量设置等,互不干扰。 比如word中设置字体颜色为黑色,并不影响QQ聊天中的字体颜色设置为蓝色的特性。
线程可以理解为一个程序中的执行流,或者是一个进程中的单一顺序的执行流,又称为轻量级的进程。线程共享相同的地址空间并共同构成一个大的进程。多线程程序是指一个程序中包含有多个执行流,它是一种实现并发机制的有效手段。从逻辑的观点上看,多线程意味着一个程序的多个语句块的同时执行。但是多线程并不等于多次启动一个程序,操作系统也不把每个线程当做独立的进程来对待。
多线程程序的通信非常简单而有效,上下文切换快并且是整个大程序的一部分的切换。线程可以彼此独立执行,一个程序可以同时使用多个线程来完成不同的小任务(大任务对应不同进程之间的任务分配,小任务对应同一个进程中多个线程之间的任务分配)。
多线程直观的理解是:对于现在流行的流媒体技术,可以边下载数据边播放流媒体数据,这是因为流媒体播放器有一个线程在下载数据并且通知另一个线程播放已经到达的多媒体数据;Word编辑器能够实时检查拼写错误,这是有一个线程在接收键盘输入并且以适当的格式显示在屏幕上,而另一个线程在读入输入的文本,分析并标记处错误的部分。但是Chrome浏览器打开多个网页貌似不是多线程而是多进程。 为什么浏览器会使用多进程架构。
总结:多任务是由操作系统控制同时执行的多个程序,多线程是在一个程序中或者是由一个程序控制同时执行的多个线程。如果很好的利用线程,可以大大的简化应用程序的设计,提高程序的质量和执行效率。
二、线程的状态
在Java中有一个Thread类用于实例化一个新的线程,它带有多个方法控制线程的状态和优先级,也有若干常量表示状态和优先级。线程从产生到消失,可以分为Newborn(创建)、Runable(就绪)、Running(运行)、 Blocked(阻塞)和Dead(死亡)等5个状态。
Newborn(创建)状态
指一个线程已经被创建但是未开始执行的一个特殊状态。此时线程可以通过start()方法启动,产生这个线程所需的系统资源,并调用Thread类的run()方法,这样就使得该线程处于可运行的状态,即Runable状态;
Runable状态
表示一个线程正在等待处理器资源,随时可被调用执行。就绪队列中的线程如果比当前正在执行的线程优先级高,则抢占;另外对于线程排队先按优先级由高到低,然后同优先级之间遵循先来先服务的调度原则。
Runing状态
正在运行的状态,Thread类有一个isAlive()方法判断线程是否正在执行的状态中。从运行状态到非运行状态的可能情形有:
- 主动或被动的释放了对处理器的控制权,进入等待队列
- 线程调用了yield或者sleep方法。sleep方法的参数为休眠的时间,线程调用sleep方法后不仅可以给同优先级一个运行机会,给低优先级也有机会。但是yield方法只能给同优先级线程机会,如果当时队列中没有同优先级的线程在等待,则调用yield方法没有作用,当前线程将继续执行;
- 线程待用suspend方法被挂起,该线程必须由其他线程调用resume方法来恢复执行,两个方法是成对使用的,但是都是已经过时的方法. 可以使用wait和notify方法达到同样的效果; suspend/resume是属于Thread类的方法,wait/notify方法时直接object的方法
- 为等候一个条件变量,线程调用wait方法。停止等待的话,需要包含该条件变量的对象调用notify <唤醒在此对象监视器上等待的单个线程> 或 notifyAll <唤醒在此对象监视器上等待的所有线程> 方法。
- 输入输出流发生线程阻塞;
归纳如下:
- 一个线程通过new操作实例化之后,进入Newborn状态;
- 通过调用start方法进入Runable状态,一个处于Runable状态的的线程将被调度执行,执行该线程相应的run方法代码;
- 通过调用线程(或从object类中继承过来的)sleep或者wait方法,这个线程进入Blocked状态。一个线程也会自行进入阻塞状态;
- 当run方法执行完毕,或者有一个异常产生,或者执行System.exit方法,则一个线程进入Dead状态;
【java多线程学习】多线程的基本概念相关推荐
- java基础学习-多线程笔记
说说Java中实现多线程有几种方法 创建线程的常用三种方式: 1. 继承Thread类 2. 实现Runnable接口 3. 实现Callable接口( JDK1.5>= ) 4. 线程池方式创 ...
- Java基础学习——多线程(线程间通信-生产者消费者代码示例)
JDK 1.5提供了多线程升级方案 将同步synchronized替换成了显示的Lock操作.可以实现唤醒.冻结指定的线程. Lock接口 Lock 实现提供了比使用 synchronized 方法和 ...
- python多线程学习-多线程下载图片
目录 开发工具 知识点 代码 总结 开发工具 python版本: python-3.8.1-amd64 python开发工具: JetBrains PyCharm 2018.3.6 x64 知识点 多 ...
- Java多线程学习——01
Java多线程学习--01 1.核心概念 程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念 进程Process:是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单 ...
- java基础不好框架能学会吗_转行Java能学会吗?零基础学习Java的学习路线
Java的跨平台性.通用性.安全性.高效性决定了这门语言在未来10年都会是最热门的语言之一.Java技术的安全性和平台移植性足够让他应用到不同的领域,它的工作需求足够大,现实一点来说即使Java濒临o ...
- java多线程学习-java.util.concurrent详解
http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...
- Java多线程学习(二)synchronized关键字(1)
转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...
- 转:Java多线程学习(吐血超详细总结)
版权声明:本文为博主林炳文Evankaka原创文章,转载请注明出处http://blog.csdn.net/evankaka 目录(?)[+] 林炳文Evankaka原创作品.转载请注明出处http: ...
- JAVA 多线程学习总结
新手一枚,Java学习中,把自己学习多线程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1] 实现线程的两种方法 [2] 线程的启动与 ...
- Java 多线程学习笔记
概念 进程 正在运行的程序,是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源,一个进程包括由操作系统分配的内存空间,包含一个或多个线程 一个进程一直运行,直到所有的非守护线 ...
最新文章
- 不是我放弃AI,是AI放弃了我!!
- 基础知识--Boxing unBoxing
- openstack之虚拟机管理命令
- java c语言union转换_C语言联合体(union)的使用方法及其本质-union
- Angular单元测试fixture.detectChanges()
- C#将对象序列化成JSON字符串
- 几个标准的说明,关于EMC的
- 【CodeForces - 260C】Balls and Boxes (思维模拟,有坑,时光倒流)
- android 和ios 混合式开发环境安装
- Java中关于内存泄漏分析和解决方案,都在这里了!
- 设计师必备的设计导航站,工作简单化
- Mac上emacs标记快捷键
- SpringBoot与缓存
- 利用python将图片版PDF转文字版PDF
- Sentaurus TCAD 2013 在RedHat7.0 Linux系统的安装教程
- 【数据挖掘】PCA 主成分分析算法过程及原理讲解
- 【文学杂谈】徐宥 - 我的大学
- macbookair 安装win11
- linux磁盘管理——quota磁盘配额GPT分区
- CorelDRAW X8官方正版序列号如何安装使用?