学习笔记-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 ...
随机推荐
- iptables 深入分析
四表五链四表:filter , nat, manager, raw五链: 五个HOOK点的链接,pre_rout, foward, post_rout, in ,out 问题:内核如何匹配,内核使能 ...
- mysql 数据库导入数据报错MySQL server has gone away解决办法
mysql 数据库导入数据报错MySQL server has gone away解决办法: 进入数据库执行以下命令即可: set global wait_timeout = 2880000; set ...
- JavaScript学习笔记2_面向对象
1.对象的定义 ECMAScript中,对象是一个无序属性集,这里的“属性”可以是基本值.对象或者函数 2.数据属性与访问器属性 数据属性即有值的属性,可以设置属性只读.不可删除.不可枚举等等 访问器 ...
- spring利用cors处理跨域问题
参考 http://blog.csdn.net/isea533/article/details/50449907 写的很全面 http://blog.csdn.net/a317560315/artic ...
- x86的字节对齐与不对齐的问题
比如这么一个结构体struct foo {short s;int n;}; struct foo bar;假设bar的地址是0x12345670如果不按4字节对齐那么bar.n的地址就是0x123 ...
- oracle 笔记---(一)
+查看主节点和副节点 oclumon manage -get MASTER REPLICA +查看当前的统计信息和保存的时间段 oclmon manage -get repsize +收集时间段内的节 ...
- Hadoop升级
1.停止所有MR任务 stop-mapred.sh 2.检查HDFS hadoop fsck / -files -blocks -locations > dfs-v-old-fsck-.log ...
- Android开发:使用Fragment改造TabActivity
TabActivity在API 13(Android 3.2)被标记为过期,需要使用Fragment来实现,Fragment是Android 3.0引入的一个概念,主要就是为了适应各种不同的屏幕大小( ...
- Oracle服务器重命名
转载自:http://www.codesec.net/view/120387.html 因工作需要准备了一台服务器专门按照oracle数据库,并且服务器上安装了windows 2008R2操作系统,在 ...
- 1.Vue.js的常用指令
Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得 ...