Java并发编程详解读书笔记(一)
一、线程介绍
讲线程之前得先了解进程(Peocess),现在的操作系统基本都支持多任务的进行,举个场景:有许多的程序员们喜欢边coding边听点轻音乐。这时计算机就是做并行任务,也就是有多个进程在同时进行。进程是一个具有独立功能的程序在数据集合上的一次执行过程,简言之一个进程就是一个应用程序,进程是系统进行资源分配和调度的基本单位,而一个进程至少包含一个线程(Thread),线程是进程中
的一个执行单位或执行实体,只拥有少量资源,线程也成为轻量级进程,线程是处理机(Java中为JVM)调度和分配的基本单位。
总结:
- 进程是系统进行资源调度和分配的基本单位
- 线程是处理机进行调度和分配的基本单位
- 一个进程至少包含有一个线程(包含关系)
- 操作系统中进程的创建与撤销开销大于线程
了解了线程的概念后我们来简单实现下边coding边听音乐:
public class TryConcurrency { public static void coding() throws InterruptedException {
while(true) {
System.out.println("I am coding..");
Thread.sleep(1000);
}
} public static void listening() throws InterruptedException {
while(true) {
System.out.println("I am listening music..");
Thread.sleep(1000);
}
} public static void main(String[] args) { try {
coding();
listening();
} catch (InterruptedException e) { e.printStackTrace();
}
}
}
执行后结果为:
该结果为一直coding,并没有向我们预期那样交替执行,我们知道Java se 程序的入口为main方法,当main方法启动后,JVM进程会分配一个main线程来执行,main线程执行是自上而下的,故执行到
coding()方法是就陷入了无限循环中无法返回,故listening()方法编程了unreachable 代码,即不可达代码。我们要想让listening方法也执行就需要再使用一个线程类Thread,让两个方法“并行”执行:
public static void main(String[] args) {
new Thread() {
@Override
public void run() {
try {
listening();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start(); try {
coding();
} catch (InterruptedException e) {
e.printStackTrace();
} }
再来看看结果:
从结果中我们可以看到达到了我们的预期。
二、线程的生命周期
线程总共有五个生命周期,分别为:new,runnable,running,blocked,terminated。翻译为中文即:创建状态,就绪/可执行状态,运行状态,阻塞状态,终止状态。
现在来以此说说这些状态,首先Thread t = new Thread()后该线程t就是为创建状态,而后再调用start()方法后进入就绪状态等待处理机进行调度,处理机通过轮询等方式后
就可以进入执行状态,在执行状态中以下操作会使线程进入阻塞状态:
- 主动调用sleep,wait方法后进入waitSet中进入阻塞状态
- 进入某个阻塞的IO操作,比如因网络数据的读写而进入阻塞状态
- 获取某个锁资源,从而加入到该锁的阻塞队列中进入阻塞状态
线程的以下情况会使其进入terminated:
- 线程运行正常结束,结束生命周期
- 线程运行出错意外结束
- JVM crash 导致所有线程都结束
三、start方法介绍分析
我们在创建Thread线程的时候需要重写run方法,并调用start方法来启动线程。那么run方法和start方法有什么关联呢?
阅读start源码就可以知道,首先它是判断threadStatus这个属性是否为0,为0才可以继续否则抛异常,然后再调用start0这个JNI方法,也就是本地方法。
深入分析后可以得知,线程进入执行状态之后JVM执行run方法中的执行体。 阅读玩start源码可以有以下总结:
- 由于首先判断threadStatus属性是否为0,可知再new Thread后初值为0,而后变化。故不可进行二次start。
- 一个线程执行结束,也就是到了terminated状态后,不可以再调用start方法。
Java并发编程详解读书笔记(一)的更多相关文章
- Java并发编程的艺术读书笔记(2)-并发编程模型
title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...
- Java并发编程的艺术读书笔记(1)-并发编程的挑战
title: Java并发编程的艺术读书笔记(1)-并发编程的挑战 date: 2017-05-03 23:28:45 tags: ['多线程','并发'] categories: 读书笔记 --- ...
- 《Java并发编程实战》读书笔记一 -- 简介
<Java并发编程实战>读书笔记一 -- 简介 并发的历史 并发的历史,也是人类利用有限的资源去提高生产效率的一个的例子. 设想现在有台计算机,这台计算机具有以下的资源: 单核CPU一个 ...
- 《Java并发编程实战》学习笔记 线程安全、共享对象和组合对象
Java Concurrency in Practice,一本完美的Java并发参考手册. 查看豆瓣读书 推荐:InfoQ迷你书<Java并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...
- 《java并发编程实战》读书笔记2--对象的共享,可见性,安全发布,线程封闭,不变性
这章的主要内容是:如何共享和发布对象,从而使它们能够安全地由多个线程同时访问. 内存的可见性 确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化. 上面的程序中NoVisibility可能 ...
- 最强Java并发编程详解:知识点梳理,BAT面试题等
本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...
- 《Java并发编程的艺术》笔记
第1章 并发编程的挑战 1.1 上下文切换 CPU通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换. 减少上下文切换的方法有4种:无锁并发编程.CAS算法.使用最少线程.使 ...
- 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式
上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Has ...
- 《Java并发编程实战》读书笔记(一)----- 简介
简史 早期的计算机中不包含操作系统,从头至尾都只执行一个程序,并且这个程序能访问计算机所有资源.随着计算机发展,操作系统的出现,使得计算机可以同时运行多个程序,并且每程序都在单独的进程内运行.为什么要 ...
随机推荐
- 总结php删除html标签和标签内的内容的方法
来源:https://www.cnblogs.com/shaoguan/p/7336984.html 经常扒别人网站文章的坑们:我是指那种批量式采集的压根不看内容的:少不了都会用到删除html标签的函 ...
- Inno Setup打包之先卸载再安装
使用Inno Setup打包程序之后,如果想要在安装前先卸载,那么需要加下面代码,需要注意的是红色标注的改为你们自己的.网上看到有些说_is1前面用AppName,但是我这边验证不行. [Setup] ...
- 如何高效使用vim
Vim 是一款文本编辑器,被称为编辑器之神,非常适合在shell 中编辑代码,熟练的使用Vim,可以让你高效的编写代码. Vim 是Vi 的增强版,所有的类Unix 系统,都自带这两个工具,这两个工具 ...
- (转)对 Linux 新手非常有用的 20 个命令
你打算从Windows换到Linux上来,还是你刚好换到Linux上来?哎哟!!!我说什么呢,是什么原因你就出现在我的世界里了.从我以往的经验来说,当我刚使用Linux,命令,终端啊什么的,吓了我一跳 ...
- 配置路由器/交换机的Telnet登录
实验目的:给配置路由器/交换机管理IP地址.设置Telnet的登录帐号.密码. 第一步:配置路由器的名称.接口IP地址. Switch> Switch>en Switch# Switch# ...
- DefaultSingletonBeanRegistry源码解析
DefaultSingletonBeanRegistry是SingletionBean注册器的默认实现. 来学习下DefaultSingletonBeanRegistry的源码: package or ...
- JavaScript实现折半查找(二分查找)
一.问题描述: 在一个升序数组中,使用折半查找得到要查询的值的索引位置.如: var a=[1,2,3,4,5,6,7,8,9]; search(a,3);//返回2 search(a,1);//左边 ...
- SocksCap64应用程序通过SOCKS代理
一.下载SocksCap64 https://pan.baidu.com/s/1B671kT9R6Zb6ch1mc4Kb2Q 提取码:hai3 一个是免安装版本,一个是安装版本,选一个即可. 下面以免 ...
- 背英语单词很困难,不妨学习一下词根词缀吧(每天10个词根、词缀)Part 3
1.ir- 不,向内 例词: irregular=ir(不)-regular(规则的)=不规则的 irrigate=ir(向内)-rigate(浇水)=灌溉 2. kilo- 千 例词: kilogr ...
- 图论--2-SAT--Ligthoj 1407 Explosion 三元关系枚举
Planet Krypton is about to explode. The inhabitants of this planet have to leave the planet immediat ...