Java线程同步中的wait()和notify()使用简单示例
2015-09-09 10:41
711 查看
一、简介
有时候并发编程中,并不只是保证数据的一致性和操作的原子性,还需要使各个任务按正确的顺序执行。在Java中提供了多种方法来实现同步。这里使用wait()和notify()来实现一个简单的双线程交替工作的同步场景。
wait()是Object的方法,使得当前线程释放该Object的锁,同时可以设置一个等待时间。notify()也是Object的方法,通知某个等待该Object的锁的线程继续执行,如果有多个线程在等待该锁,会随机选择一个唤醒。notifyAll()则会唤醒所有线程。
如果在同步方法里调用上述三个方法,则默认的锁是当前的对象的锁。
二、用代码实现两个线程交替打印aa和bb
有时候并发编程中,并不只是保证数据的一致性和操作的原子性,还需要使各个任务按正确的顺序执行。在Java中提供了多种方法来实现同步。这里使用wait()和notify()来实现一个简单的双线程交替工作的同步场景。
wait()是Object的方法,使得当前线程释放该Object的锁,同时可以设置一个等待时间。notify()也是Object的方法,通知某个等待该Object的锁的线程继续执行,如果有多个线程在等待该锁,会随机选择一个唤醒。notifyAll()则会唤醒所有线程。
如果在同步方法里调用上述三个方法,则默认的锁是当前的对象的锁。
二、用代码实现两个线程交替打印aa和bb
package com; /** * 本例演示了wait()和notify的简单用法 使用两个线程接替工作,线程1打印aa,线程2打印bb * * 模拟了一个简单的线程同步场景 * */ public class Main { String lock = "bfghg"; Boolean flag = false;// 标志,如果是true打印aa,如果是bb打印bb public static void main(String[] args) throws Exception { final Main m = new Main(); // 开启线程不停打印aa new Thread(new Runnable() { @Override public void run() { try { m.method1(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); // 开启线程不停打印bb new Thread(new Runnable() { @Override public void run() { try { m.method2(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } // 打印aa public void method1() throws InterruptedException { while (true) { synchronized (lock) { if (flag) { lock.wait(); } System.out.println("aa"); Thread.sleep(1000); flag = !flag; lock.notify(); } } } // 打印bb的方法 public void method2() throws InterruptedException { while (true) { synchronized (lock) { if (!flag) { lock.wait(); } System.out.println("bb"); Thread.sleep(1000); flag = !flag; lock.notify(); } } } }
相关文章推荐
- Java输入输出
- java springMVC jsp页面时间规范显示、页面无缓存、session读写以及后台增加跳转集锦
- 在Eclipse中设置中文JavaDOC
- spring boot 入门
- javax.persistence包
- 必须知道的八大种排序算法【java实现】(一) 冒泡排序、快速排序
- Java 正则表达式
- 文章标题
- javax.ws.rs 创建 restful 服务 与使用 spring框架创建的 restful有啥区别呢?
- spring提供的解决中文乱码方案
- java优秀书籍列表
- Spring @Transactional (声明试事务)
- ajax传递json数据,springmvc后台就收json数据
- 从Zero学习String源码
- 7 款开源 Java 反编译工具
- JAVA读写文件
- ubuntu按转jdk
- ubuntu按转jdk
- 一个Java Dao测试用例
- java多线程实例