Java并发学习笔记(11)阻塞线程
2014-07-17 00:00
549 查看
阻塞指的是暂停一个线程的执行以等待某个条件发生.java实现阻塞的方式如下几种:
(1) 调用Thread.sleep()方法它已毫秒作为单位让该线程睡眠一段时间,到时间后会自行唤起线程.也可以使用TimeUnit.XX.sleep() XX是TimeUnit的常量代表休眠的时间单位具体查看JDK即可.
(2) 使用Thread的suspend() 和 resume() 方法 不过使用suspend方法会引起死锁,所以该方式已过时不介意使用
(3) 使用Thread的静态方法yield()方法.该方法会暂停当前线程,并且执行其他线程.但是注意.yield方法只是给cpu一种建议,这种建议就是我已经完成我总重要的方法了.可以执行其他线程了.但是注意CPU可不会100%听取这种建议
(4) 调用Object的wait() 和 notify()/notfyAll() 方法:两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用。 对wait和notify/notifyAll方法调用必须在synchronized方法或synchronized块中调用.调用如果不在synchronized方法内调用会抛出IllegalMonitorStateException运行时异常
a) wait的可以做为一种条件-等待,当条件不满足时挂起线程:
i. 永远设置一个条件
ii. 永远在执行wait前先检查条件是否符合(条件使用在while中比较合适每次使用notify通知挂起线程继续执行前再检查一遍条件会)
iii.永远在循环中调用wait(while最佳)
iv. 构成条件的变量都是被锁保护的
b) 使用wait挂起的线程会形成一个等待队列,当使用notify会按挂起的顺序来唤起线程,使用notifyAll会使得线程以常规方式获取锁,synchronized是非公平的.
(5) 任务在等待某个输入输出完成.
(6) 任务试图在某个对象上调用同步方法(synchronized)但是对象锁不可用.
(1) 调用Thread.sleep()方法它已毫秒作为单位让该线程睡眠一段时间,到时间后会自行唤起线程.也可以使用TimeUnit.XX.sleep() XX是TimeUnit的常量代表休眠的时间单位具体查看JDK即可.
(2) 使用Thread的suspend() 和 resume() 方法 不过使用suspend方法会引起死锁,所以该方式已过时不介意使用
(3) 使用Thread的静态方法yield()方法.该方法会暂停当前线程,并且执行其他线程.但是注意.yield方法只是给cpu一种建议,这种建议就是我已经完成我总重要的方法了.可以执行其他线程了.但是注意CPU可不会100%听取这种建议
(4) 调用Object的wait() 和 notify()/notfyAll() 方法:两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用。 对wait和notify/notifyAll方法调用必须在synchronized方法或synchronized块中调用.调用如果不在synchronized方法内调用会抛出IllegalMonitorStateException运行时异常
a) wait的可以做为一种条件-等待,当条件不满足时挂起线程:
i. 永远设置一个条件
ii. 永远在执行wait前先检查条件是否符合(条件使用在while中比较合适每次使用notify通知挂起线程继续执行前再检查一遍条件会)
iii.永远在循环中调用wait(while最佳)
iv. 构成条件的变量都是被锁保护的
b) 使用wait挂起的线程会形成一个等待队列,当使用notify会按挂起的顺序来唤起线程,使用notifyAll会使得线程以常规方式获取锁,synchronized是非公平的.
(5) 任务在等待某个输入输出完成.
(6) 任务试图在某个对象上调用同步方法(synchronized)但是对象锁不可用.
相关文章推荐
- Java并发学习笔记(16)守护线程,线程组
- 张孝祥java.concurrent线程并发学习笔记 - concurrent简介
- Java线程学习笔记之BlockingQueue阻塞队列
- Java并发学习笔记(4)线程的取消,关闭和异常终止
- java高并发程序设计学习笔记二多线程基础
- Java线程学习笔记之并发集合类
- Java并发读书学习笔记(十一)——原子变量与非阻塞同步机制
- Java并发学习笔记(5)停止基于线程的服务
- 张孝祥java.concurrent线程并发学习笔记 - 传统线程回顾
- 张孝祥java.concurrent线程并发学习笔记 - concurrent简介
- JAVA并发编程学习笔记------线程的三种创建方式
- Java并发学习笔记(1) 线程与进程
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
- JAVA学习笔记50——线程状态+停止进程+阻塞进程
- java学习笔记之线程并发库
- 【Java学习笔记】11:线程的状态转换1
- 【安全牛学习笔记】 安装Java、安装显卡驱动、安装网卡补丁、并发线程限制、电源优化.txt
- 黑马程序员—11—java基础:有关线程通信的学习笔记和学习心得体会
- 学习java多线程的笔记3-使用BlockingQueue阻塞队列来模拟两个线程之间的通信
- Java并发学习笔记(7)线程的同步 (锁)