[Java并发编程之美]第1章 线程基础
第1章 线程
1.1 线程与进程
- 进程是操作系统资源分配和调度的基本单位,但cpu资源是分配到线程的,也就是线程是CPU分配的基本单位。
- 线程自己的栈资源中,存放的局部变量是线程私有的,其他线程无法访问,除此之外栈还存线程的调用栈帧。
1.2 线程创建
三种方式:实现Runnable接口的run方法;继承Thread类并重写run方法;使用FutureTask方式。
1.3 线程等待与通知(等待与通知的方法都在Object类中提供)
等待
wait()
线程先要事先获得共享变量上的监视器锁,然后当一个线程调用一个共享变量的wait()方法,该线程会被阻塞挂起,并且释放掉该共享变量上的锁。直到发生:(1)此后其他线程调用了该共享对象的notify或notifyAll()方法 (2)此后其他线程调用了该线程的interrupt()方法。(该线程会抛出InterruptedException异常返回)wait(long timeout)
超时参数timeout:如果该线程调用wait(long timeout)挂起后,(过了timeout ms时间仍未被唤醒,) 该函数会因为等待时间超时返回。
wait()内部就是调用了wait(0),两者相当。wait(long timeout,int nanos)
通知
notify()
一个线程调用共享对象的notify()方法后,会唤醒有一个在该变量上调用wait系列方法后被挂起的线程,具体唤醒哪个线程是随机的。
此外,被唤醒的线程不能马上从wait方法返回并继续执行,它必须在获取了共享对象的监视器锁后才可以返回。notifyAll()
notifyAll()方法会唤醒所有在该共享变量上由于调用wait系列方法而被挂起的线程(条件是必须是在notifyAll之前调用了wait系列方法而被挂起的线程)。
1.4 等待线程执行终止的join方法(Thread类提供)
join方法适用于等待某几件事情完成后才继续往下执行的情景。具体地,线程A调用线程B的join方法会被阻塞,等待线程B执行完毕返回。
1.5 让线程睡眠的sleep方法(Thread类提供的静态方法)
调用线程会暂时让出指定时间的执行权,也就是在这期间不参与CPU调度,但是该线程所拥有的监视器资源,比如锁还是持有不让出的。
1.6 让出CPU执行权的yield方法(Thread类提供的静态方法)
- 当一个线程调用yield方法,当前线程会让出CPU使用权,然后处于就绪状态,线程调度器会从线程就绪队列里面获取一个线程优先级最高的线程,当然也有可能会调度到刚刚让出CPU的那个线程来获取CPU执行权。
- yield与sleep方法的区别在于,调用yield方法,线程只是让出自己剩余的时间片,并没有被阻塞挂起,而是处于就绪状态,线程调度器下一次调度时也有可能调度到当前线程执行。而sleep是当前调用线程被阻塞挂起指定时间。
- yield方法很少被使用。一般用于调试时复现由于并发竞争条件导致的问题,或用来设计并发控制。
1.7 线程中断
1 置中断标志:void interrupt()方法
调用线程A的interrupt()方法:设置线程A的中断标志为true。
注意,只是设置了标志,但线程A并没有被中断,会继续往下执行。
如果线程A正处于调用了wait()或join()或sleep()而被阻塞挂起的状态,而线程B调用了线程A的interrupt方法,线程A会直接抛出InterruptedException异常。2 查看中断标志
- 法1 boolean isInterrupted()方法
检测调用的线程实例对象是否被中断,不清除中断标志。 - 法2 boolean interruputed()方法
静态方法,检测当前语句所在线程是否被中断,清除中断标志。 - 使用场景1:用来作为线程终止的条件,判断若中断标志为true,则线程终止。
- 使用场景2:使阻塞挂起的线程提前终止。
- 法1 boolean isInterrupted()方法
1.8 线程上下文切换
- CPU资源的分配采用了时间片轮转的方式。上下文切换就是保存当前线程的执行现场,恢复下一个线程的执行现场。
- 上下文切换发生场景:1 当前线程的CPU时间片使用完处于就绪态。2 当前线程被其他线程中断。
1.9 线程死锁
- 死锁:两个或两个以上线程在执行过程中,因争夺资源造成互相等待的现象。
- 产生死锁必须具备的四个条件:1 互斥 2 请求并持有 3 不可剥夺 4 环路等待
- 避免死锁:有序申请资源
1.10 守护(daemon)线程与用户(user)线程
- 守护线程与用户线程:当最后一个非守护线程退出时,JVM会正常退出。即守护线程是否结束并不影响JVM的退出。
所以如果希望主线程结束后JVM马上结束,创建子线程时可以将其设置为守护线程;反之设置子线程为用户线程。 - 例子:守护线程:垃圾回收线程;用户线程:main函数所在的线程。
- 设置线程为守护线程:
thread.setDaemon(true);
[Java并发编程之美]第1章 线程基础的更多相关文章
- [Java并发编程之美]第1章 线程基础 补充知识
1.2线程创建与运行 创建线程有三种方式: 继承Thread类并重写run方法: 实现Runnable接口的run方法,new Thread时将该类对象作为参数传入: 实现Callable接口的cal ...
- [Java并发编程之美]第2章 并发编程的其他基础知识 补充知识
基本概念 并行与并发 并行:单位时间内多个任务同时执行(多核CPU). 并发:同一时间段内多个任务同时都在执行(CPU时间片轮转). 线程安全性问题 线程安全问题:指多个线程同时读写一个共享资源而没有 ...
- [Java并发编程之美]第2章 synchroized关键字
###synchronized关键字 synchronized块是Java提供的一种原子性内置锁,每个对象都可以把它当同步锁来用.线程在进入synchronized块钱会自动获取内部锁,这时候其他线程 ...
- 【java并发编程实战】第五章:基础构建模块
1.同步容器类 它们是线程安全的 1.1 vector和hashtable. 和Collections.synchronizeXxx()一样.实现方式就是在每个方法里面加入synchronize代码块 ...
- java并发编程之美-阅读记录1
1.1什么是线程? 在理解线程之前先要明白什么是进程,因为线程是进程中的一个实体.(线程是不会独立存在的) 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程中的 ...
- Java并发编程(二)如何保证线程同时/交替执行
第一篇文章中,我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜.本篇我们依然不会有源码分析,而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法. ...
- 《Java并发编程实战》第三章 对象的共享 读书笔记
一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见 ...
- java并发编程之美-阅读记录11
java并发编程实践 11.1ArrayBlockingQueue的使用 有关logback异步日志打印中的ArrayBlockingQueue的使用 1.异步日志打印模型概述 在高并发.高流量并且响 ...
- java并发编程JUC第九篇:CountDownLatch线程同步
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
随机推荐
- jQuery的事件与 动画
什么是事件: 事件的本质是委托. Jquery的 方法: $().css(); $().click(); 等等. 鼠标的事件: 区别在于:mouseover与mouseout再进入或离开后会执行这两个 ...
- 【ASP.NET Core学习】使用JWT认证授权
概述 认证授权是很多系统的基本功能 , 在以前PC的时代 , 通常是基于cookies-session这样的方式实现认证授权 , 在那个时候通常系统的用户量都不会很大, 所以这种方式也一直很好运行, ...
- Golang笔记整理--One day
题外话: 很早就有整理学习笔记的想法,今天将想法付诸于行动,将Golang相关知识系统整理一遍,此分类为Golang学习笔记,最近开始学习这门语言的同学可以参考. 一 第一个Go程序: hello.g ...
- 【SCOI2013】摩托车交易 - 最大生成树+树链剖分
题目描述 mzry1992 在打完吊针出院之后,买了辆新摩托车,开始了在周边城市的黄金运送生意.在mzry1992 生活的地方,城市之间是用双向高速公路连接的.另外,每条高速公路有一个载重上限,即在不 ...
- C++指针变量的基本写法
指针变量与应用——动态数组 在C++中,有一种神奇的变量,它不可以表示一个值,但是可以表示某个元素的地址,通过地址来访问这个元素. 打个比方:你有一张地图和一个坐标,你就可以通过访问这个坐标来达到你访 ...
- Spring Security 实战干货:实现自定义退出登录
文章目录 1. 前言 2. 我们使用 Spring Security 登录后都做了什么 2. 退出登录需要我们做什么 3. Spring Security 中的退出登录 3.1 LogoutFilte ...
- Jmeter 常用函数(28)- 详解 __FileToString
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 读取整个文件 语法格式 ${__Fil ...
- 基于go+etcd实现分布式锁
原文链接:https://www.yii-china.com/topic/detail/113 package main import ( "context" "fmt& ...
- elaticsearch
- DHCPV6 vs DHCPV4
原文链接:https://blog.csdn.net/kdb_viewer/article/details/83310904 一.DHCPv4 vs DHCPv6 1. 相同点 使用DHCP clie ...