学习笔记-java 多线程
背景说明:
多线程并发与管理,是java基础知识里的重点,本文根据《java核心技术第八版》中的多线程技术的学习,对知识点进行整理;这里只对基础知识点进行简单罗列,以达到对知识点有网状关联的效果,能起到提纲挈领的作用,在于其它知识点融合时,有更好的一览效果。
线程概念
1.明确进程与线程的区别
2.不要调用Thread或Runnable对象的run方法,直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程。应该调用Thread.start方法。这个方法将创建一个执行run方法地新线程。
中断线程
1.请求终止线程的方法是interrupt方法
2.在线程阻塞状态下调用interrupt方法时,会产生InterruptException异常。
3.有2个类似方法,interrupted和isInterrupted方法;interrupted是静态方法,它检测当前线程是否中断,并清除该线程的中断状态;isInterrupted是一个实例方法,可用来检验是否线程被终止,不改变线程的中断状态。
线程状态
- 新生
- Runnable 可运行状态
- Blocked 被阻塞
- Waiting 等待
- Timed waiting 计时等待
- Terminated 被终止
重点说明:
Thread的stop,suspend,resume方法已经过时。
Thread.join 方法等待终止指定的线程。注:如果有3个线程,依次分别执行,强调按照顺序执行,主要考察的就是这个方法地使用。
线程属性
属性包括:线程优先级,守护线程,线程组以及处理未捕获异常的处理器
1.优先级
可以设置最小到最大:1到10,norm_priority被定义为5
2.守护线程
作用就是为其它线程服务
同步
常用来举例就是多个线程同时存取钱或者是买火车票。
1.锁对象
从java1.5起,有2种机制可以防止代码受到并发访问的干扰:synchronized ,ReentrantLock.。把解锁操作括在finally子句之内是至关重要的。
2.条件对象
条件对象用来管理哪些已经获得了一个锁但是缺不能有用工作的线程。举例子:如果在多线程转账时,如果账户余额不足,需要等待其他线程转入金额时,就是典型用到条件对象的地方;这里面用到了锁,一个锁可以有一个或多个相关的条件对象。通过条件对象的await方法,当前线程就被阻塞了,并放弃了锁。一个线程调用了await方法,它进入了该条件的等待集,等锁可用时,该线程不能马上解除阻塞,相反它是处于阻塞状态,直到另一个线程调用同一个条件对象的signalAll方法时为止。
3.synchronized关键字
相当于一个内部锁,只有一个条件对象。利用Object的wait,notifyAll,notify;与条件对象里的方法不同:await,signalAll,singal
4.同步阻塞
5.Volatile域
对于域的并发访问是安全的:
- 域是final,并且在构造器调用完成之后被访问;
- 对域的访问,由共有锁进行保护
- 域是Volatile
6.锁测试与超时
因为lock方法是不能被中断的,如果一个线程在等待一个锁时被中断,中断线程在获得锁之前一直处于阻塞状态。如果出现死锁,那么lock方法就无法终止。然而调用带有超时参数的tryLock,那么线程在等待期间被中断,将抛出InterruptedException异常。这是一个非常有用的特性,因为允许程序打破死锁。
7.读写锁
如果很多线程从一个数据结构读取数据而很少线程修改其中数据的话,用ReentrantReadWriteLock类就非常有用。
阻塞队列
对于许多线程问题,可以通过使用一个或多个队列以优雅而安全的方式将其形式化。
ArrayBlockQueue
LinkedBlockQueue
线程安全的集合
ConcurrentHashMap
ConcurrentSkipListMap
ConcurrentSkipListSet
ConcurrentLinkedQueue
在java以前版本中,Vector和HashTable提供了线程安全,在1.2中这些类被弃用,取而代之的是ArrayList和HashMap,这些类不是线程安全的,而集合库中提供了不同的机制,通过使用同步包装器变成线程安全的
Collections.synchronizedList(new ArrayList)
Collections.synchronizedMap(new HashMap)
Callable与Future
FutureTask包装器是一种非常便利的机制,可以将Callable转换为Future和Runnable
Callable<Integer> myComputation = …
FutureTask<Integer> task = new FutureTask<Integer>(myComputation);
Thread t = new Thread(task);//it is a Runnable
t.start();
…
Integer result = task.get();//it is future
执行器
Executors中有newCachedThreadPool,newFixedThreadPool,newSingleThreadExecutor
还有预定执行,newScheduledThreadPool
同步器
1.倒计时门栓CountDownLatch
一次性的,一旦计数为0,就不能再重用
学习笔记-java 多线程的更多相关文章
- 孙鑫VC学习笔记:多线程编程
孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010 HQU Email:zgzhaobo@gmail.com QQ:452728574 Latest Modified ...
- [java学习笔记]java语言核心----面向对象之this关键字
一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理: 代表的是当前对象. this就是所在函数 ...
- [java学习笔记]java语言核心----面向对象之构造函数
1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用: 给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...
- 大数据学习笔记——Java篇之集合框架(ArrayList)
Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...
- Java学习笔记 -- Java定时调度工具Timer类
1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...
- 大数据学习笔记——Java篇之网络编程基础
Java网络编程学习笔记 1. 网络编程基础知识 1.1 网络分层图 网络分层分为两种模型:OSI模型以及TCP/IP网络模型,前者模型分为7层,是一个理论的,参考的模型:后者为实际应用的模型,具体对 ...
- 大数据学习笔记——Java篇之IO
IO学习笔记整理 1. File类 1.1 File对象的三种创建方式: File对象是一个抽象的概念,只有被创建出来之后,文件或文件夹才会真正存在 注意:File对象想要创建成功,它的目录必须存在! ...
- NDK学习笔记-JNI多线程
前面讲到记录到ffmpeg音视频解码的时候,采用的是在主线程中进行操作,这样是不行的,在学习了POSIX多线程操作以后,就可以实现其在子线程中解码了,也可以实现音视频同步了 简单示例 在native实 ...
- [Java学习笔记] Java异常机制(也许是全网最独特视角)
Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...
随机推荐
- zoj4062 Plants vs. Zombies 二分+模拟(贪心的思维)
题目传送门 题目大意:有n个植物排成一排,标号为1-n,每株植物有自己的生长速度ai,每对植物浇一次水,该株植物就长高ai,现在机器人从第0个格子出发,每次走一步,不能停留,每一步浇一次水,总共可以走 ...
- new Date("2018-01-01 11:11:11").valueOf() 在IE下会返回 NaN
原因是在ie下 new Date不能处理 小横线 这种时间格式,但是 替换成 斜线就可以正常获得毫秒数,像下面这样: new Date(('2018-01-01 11:11:11').replace( ...
- C# 关于时区的操作
有关时区自动更新的 在注册表以下路径,start键值3,4表示自动/不自动更新 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tza ...
- 1140 Look-and-say Sequence (20 分)
Look-and-say sequence is a sequence of integers as the following: D, D1, D111, D113, D11231, D112213 ...
- [转] 使用Docker容器,这些错误千万别犯
[From]http://www.maiziedu.com/article/23592/ 之前我写了一篇文章(作为ruby程序猿, 为什么非得用Docker?),里面详细讲了他的优点,相信大家都有所了 ...
- Flutter FormatException: Bad UTF-8 encoding 0xc3 (at offset 172)
是文件编码问题. 1,打开 Android Studio 进入设置界面 Ctrl + Alt + S 或 File --> Settings 打开如下界面: 2,将 Project Encode ...
- ASP.Net Core 发布ABP项目遇到的错误
1.HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 与ASP.NET时代不同,ASP.NET Core不再是由IIS工作 ...
- 转 AIX7.2+11.2.0.4RAC实施
参考 https://blog.csdn.net/alangmei/article/details/18310381 https://blog.csdn.net/smasegain/article/d ...
- IT职场?未来?
转自 IT职场?未来? 不能否认,有些技术大牛,生活也过的不错,工资不少挣.但是这种人,本来就不多啊,很少啊.这些人一般都是小时候就搞程序的,你觉得你半路出家,能变成这种超级牛人么?? 而且这些牛人, ...
- oracle 基础知识(五)--回滚(commit和rollback)
一,commit 01,commit干了啥 commit 就是提交的意思.也就是当你把99%的东西都做好了,然后你执行最后一步的操作...再commit前的话你可能啪啪啪啪啪,敲了几百条sql DML ...