java并发(一)wait,notify的使用
来源:互联网 发布:成都网络推广收入 编辑:程序博客网 时间:2024/06/04 18:21
Java是第一个内置对多线程支持的主流编程语言。在Java5之前,对多线程的支持主要是通过对块结构的同步实现的(synchronized配合wait,notify,notifyAll),Java5引入了java.util.concurrent包,提供了对多线程编程的更高层的支持。
在Java中,除了int等基本类型之外,一切皆为对象。synchronized关键字以及Object类中的wait,notify和notifyAll方法为我们编写多线程程序提供了原始的支持。
例如:
1
public
class
A {
2
public
synchronized
void
fun() {
3
...
4
}
5
}
在调用方法fun之前,调用该方法的执行线程必须要先获得类A的实例(a)的对象锁。上面的方法fun在功能上等同于:
1
public
void
fun() {
2
synchronized
(
this
) {
3
...
4
}
5
}
通常可以使用synchronized和notify,notifyAll以及wait方法来实现线程之间的数据传递及控制。对于对象obj来说:
- obj.wait():该方法的调用,使得调用该方法的执行线程(T1)放弃obj的对象锁并阻塞,直到别的线程调用了obj的notifyAll方法、或者别的线程调用了obj的notify方法且JVM选择唤醒(T1),被唤醒的线程(T1)依旧阻塞在wait方法中,与其它的线程一起争夺obj的对象锁,直到它再次获得了obj的对象锁之后,才能从wait方法中返回。(除了notify方法,wait还有带有时间参数的版本,在等待了超过所设时间之后,T1线程一样会被唤醒,进入到争夺obj对象锁的行列;另外中断可以直接跳出wait方法)
- obj.notify():该方法的调用,会从所有正在等待obj对象锁的线程中,唤醒其中的一个(选择算法依赖于不同实现),被唤醒的线程此时加入到了obj对象锁的争夺之中,然而该notify方法的执行线程此时并未释放obj的对象锁,而是离开synchronized代码块时释放。因此在notify方法之后,synchronized代码块结束之前,所有其他被唤醒的,等待obj对象锁的线程依旧被阻塞。
- obj.notifyAll():与notify的区别是,该方法会唤醒所有正在等待obj对象锁的线程。(不过同一时刻,也只有一个线程可以拥有obj的对象锁)
要注意的是,wai,notify以及notifyAll方法的调用必须在相应的synchronized代码块之中。例如:
1
synchronized
(obj) {
2
while
(xxx) {
3
obj.wait();
4
}
5
...
6
}
下面写个小例子,来说明wait方法返回之前要重新获得对象锁,以及notify方法执行之后并不立即释放对象锁。
01
public
class
MThread
implements
Runnable {
02
public
synchronized
void
assign() {
03
this
.notifyAll();
04
System.err.println(
"out of notifyAll"
);
05
while
(
true
){}
06
}
07
08
public
synchronized
void
await()
throws
InterruptedException {
09
this
.wait(
5000
);
10
System.err.println(
"out of wait"
);
11
}
12
13
@Override
14
public
void
run() {
15
try
{
16
await();
17
}
catch
(InterruptedException e) {
18
}
19
}
20
21
}
22
23
24
public
class
Main {
25
public
static
void
main(String[] args) {
26
MThread mThread =
new
MThread();
27
Thread thread =
new
Thread(mThread);
28
thread.start();
29
30
try
{
31
Thread.sleep(
1000
);
32
}
catch
(InterruptedException e) {
33
e.printStackTrace();
34
}
35
mThread.assign();
36
}
37
}
0 0
- java并发(一)wait,notify的使用
- java并发(一)wait,notify的使用
- java并发(一)wait,notify的使用
- java并发编程---wait、notify
- java wait,notify使用
- java notify wait 使用
- java挑战高并发 之(10):使用wait/notify/notifyAll实现线程间通信的几点重要说明
- Java并发编程(10):使用wait/notify/notifyAll实现线程间通信的几点重要说明
- java wait,notify,sleep的使用
- java多线程之wait,notify的使用
- java wait和notify的使用
- java wait和notify的使用
- Java wait()和notify()的使用
- 【Java并发编程】:使用wait/notify/notifyAll实现线程间通信的几点重要说明
- wait()/notify()的使用
- 多线程并发中的简单使用wait和notify的方法
- Java并发编程(详解wait(), notify(),sleep())
- Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) (r)
- jQuery学习笔记(3)
- linux 文件(目录)之软链接,硬链接
- hdu3071
- JDK的安装及其运行的环境变量的配置
- 初学者:学习C++primer
- java并发(一)wait,notify的使用
- hdu 2473 Junk-Mail Filter(并查集)
- ios真机运行
- LayoutInflater的作用及使用
- 设计模式——怎么就给分成三类了呢?
- 使用EF6和MVC5实现一个简单的选课系统--EF6的弹性链接和命令拦截(4/12)
- java SE 集合(三)
- KMP中next数组的理解
- 割点、桥、双连通分量