实例分析Java notifyAll方式的使用
2016-07-22 19:50
459 查看
java notifyAll()方法唤醒所有处于阻塞状态的线程继续执行阻塞后的代码逻辑。
/**
* 当方法wait()被执行后,锁被自动释放,但是执行完notify()方式,锁却不自动释放
**/
class ServiceWait {
public void testMethod(Object lock) {
try {
synchronized (lock) {
System.out.println(“begin wait start== ” + System.currentTimeMillis() + ” —ThreadName ” + Thread.currentThread().getName());
lock.wait();
System.out.println(“end wait == ” + System.currentTimeMillis() + ” —ThreadName ” + Thread.currentThread().getName());
}
} catch (InterruptedException e) {
e.toString();
}
}
}
class NotifyAllThread extends Thread {
private Object lock;
public NotifyAllThread(Object lock) {
super();
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
lock.notifyAll();
}
}
}
class A extends Thread {
private Object lock;
public A(Object lock) {
super();
this.lock = lock;
}
@Override
public void run() {
ServiceWait serviceWait = new ServiceWait();
serviceWait.testMethod(lock);
}
}
class B extends Thread {
private Object lock;
public B(Object lock) {
super();
this.lock = lock;
}
@Override
public void run() {
ServiceWait serviceWait = new ServiceWait();
serviceWait.testMethod(lock);
}
}
class C extends Thread {
private Object lock;
public C(Object lock) {
super();
this.lock = lock;
}
@Override
public void run() {
ServiceWait serviceWait = new ServiceWait();
serviceWait.testMethod(lock);
}
}
public static void main(String[] args) {
}
代码执行结果:
begin wait start== 1469187894185 —ThreadName Thread-0 —–线程A执行run()方法,然后阻塞等待通知
begin wait start== 1469187894185 —ThreadName Thread-1—–线程B执行run()方法,然后阻塞等待通知
begin wait start== 1469187894185 —ThreadName Thread-2—–线程C执行run()方法,然后阻塞等待通知
等待2钟,然后通过线程NotifyAllThread来通知其他的线程继续执行。
end wait == 1469187896186 —ThreadName Thread-2
end wait == 1469187896187 —ThreadName Thread-1
end wait == 1469187896187 —ThreadName Thread-0
/**
* 当方法wait()被执行后,锁被自动释放,但是执行完notify()方式,锁却不自动释放
**/
class ServiceWait {
public void testMethod(Object lock) {
try {
synchronized (lock) {
System.out.println(“begin wait start== ” + System.currentTimeMillis() + ” —ThreadName ” + Thread.currentThread().getName());
lock.wait();
System.out.println(“end wait == ” + System.currentTimeMillis() + ” —ThreadName ” + Thread.currentThread().getName());
}
} catch (InterruptedException e) {
e.toString();
}
}
}
class NotifyAllThread extends Thread {
private Object lock;
public NotifyAllThread(Object lock) {
super();
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
lock.notifyAll();
}
}
}
class A extends Thread {
private Object lock;
public A(Object lock) {
super();
this.lock = lock;
}
@Override
public void run() {
ServiceWait serviceWait = new ServiceWait();
serviceWait.testMethod(lock);
}
}
class B extends Thread {
private Object lock;
public B(Object lock) {
super();
this.lock = lock;
}
@Override
public void run() {
ServiceWait serviceWait = new ServiceWait();
serviceWait.testMethod(lock);
}
}
class C extends Thread {
private Object lock;
public C(Object lock) {
super();
this.lock = lock;
}
@Override
public void run() {
ServiceWait serviceWait = new ServiceWait();
serviceWait.testMethod(lock);
}
}
public static void main(String[] args) {
Object lock = new Object(); A a = new A(lock); a.start(); B b = new B(lock); b.start(); C c = new C(lock); c.start(); //等待一个时间,可以清晰看到,上面的线程一直处于阻塞状态 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //执行通知线程 NotifyAllThread m = new NotifyAllThread(lock); m.start(); }
}
代码执行结果:
begin wait start== 1469187894185 —ThreadName Thread-0 —–线程A执行run()方法,然后阻塞等待通知
begin wait start== 1469187894185 —ThreadName Thread-1—–线程B执行run()方法,然后阻塞等待通知
begin wait start== 1469187894185 —ThreadName Thread-2—–线程C执行run()方法,然后阻塞等待通知
等待2钟,然后通过线程NotifyAllThread来通知其他的线程继续执行。
end wait == 1469187896186 —ThreadName Thread-2
end wait == 1469187896187 —ThreadName Thread-1
end wait == 1469187896187 —ThreadName Thread-0
相关文章推荐
- java(九九乘法表输出1,3,5,7,9)
- java打印文件夹以及文件的路径打印
- eclipse快捷键 包括查找类、方法、变量
- Java 构建器
- Java Map集合遍历的三种方法
- hadoop程序问题:java.lang.IllegalArgumentException: Wrong FS: hdfs:/ expected file:///
- java-关于java中内存解析的问题
- Java中getResourceAsStream的用法
- java(继承,封装,实现接口)
- Java应用程序监控JavaMelody
- @Transactional spring 配置事务 注意事项(转载)
- java(冒泡排序例子)
- Java 集合Collection与List的详解
- Java序列化(Serializable)与反序列化
- java(九九乘法表)
- Java面经总结
- 50道JAVA基础编程练习题
- springMVC 请求参数的乱码解决
- Spring学习笔记(二十): eclipse或Myeclipse中web项目没有run on server
- 第一个使用Spring Tool Suite(STS)和Maven建立的Spring mvc 项目