java 多线程等待、唤醒机制实例
2016-10-26 12:46
239 查看
例子:
1、实体类
public class Student {
String name;
int age;
boolean flag = false; // 表示没有值
}
2、线程1
public class SetThread implements Runnable {
private Student s;
private int x = 0;
public SetThread(Student s) {
this.s = s;
}
@Override
public void run() {
while (true) {
synchronized (s) {
// 判断,如果有值,就等待
if (s.flag) {
try {
s.wait(); //t1就等待在这里了。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 设置值
if (x % 2 == 0) {
s.name = "林青霞";
s.age = 27;
} else {
s.name = "刘意";
s.age = 30;
}
x++; //x=1,x=2,
// 有值后,就修改标记
s.flag = true;
s.notify(); // 唤醒等待的线程,唤醒其他的线程,不代表其他的线程能够立即执行。
}
//可能t1抢到,也可能t2抢到
}
}
}
3、线程2
public class GetThread implements Runnable {
private Student s;
public GetThread(Student s) {
this.s = s;
}
@Override
public void run() {
while (true) {
synchronized (s) {
// 判断没有值,就等待
if (!s.flag) {
try {
s.wait(); //t2在这等待了。
//t2线程在这里等待,那么,它就会释放锁对象。
//将来,当它再次获取到执行权的时候,是从哪里等待,哪里醒来。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(s.name + "---" + s.age);
//林青霞---27
// 修改标记
s.flag = false;
s.notify(); //唤醒其他的线程
}
//可能t2,可能t1
}
}
}
4、测试代码
/*
* 需求:我有一个学生,我可以对其属性设置值,我也可以获取其属性值。请用线程间通信的案例来体现。
*
* 资源:Student
* 设置线程:SetThread
* 获取线程:GetThread
* 测试类:StudentDemo
*
* 刚才的数据是大片大片出现的。我想把这个动作改进为依次出现的数据。
* 怎么办呢?
* 原理:如果我的学生属性没有值,我应该先赋值,然后才能使用。
* 如果学生的属性有值,应该使用后再赋值。
*
* 为了配合这个操作,java提供了一种机制:等待唤醒机制。
* notify()
* wait()
* 这两个方法的调用应该通过锁对象去使用。
*/
public class StudentDemo {
public static void main(String[] args) {
// 创建一个资源
Student s = new Student();
SetThread st = new SetThread(s);
GetThread gt = new GetThread(s);
Thread t1 = new Thread(st);
Thread t2 = new Thread(gt);
t1.start();
t2.start();
}
}
1、实体类
public class Student {
String name;
int age;
boolean flag = false; // 表示没有值
}
2、线程1
public class SetThread implements Runnable {
private Student s;
private int x = 0;
public SetThread(Student s) {
this.s = s;
}
@Override
public void run() {
while (true) {
synchronized (s) {
// 判断,如果有值,就等待
if (s.flag) {
try {
s.wait(); //t1就等待在这里了。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 设置值
if (x % 2 == 0) {
s.name = "林青霞";
s.age = 27;
} else {
s.name = "刘意";
s.age = 30;
}
x++; //x=1,x=2,
// 有值后,就修改标记
s.flag = true;
s.notify(); // 唤醒等待的线程,唤醒其他的线程,不代表其他的线程能够立即执行。
}
//可能t1抢到,也可能t2抢到
}
}
}
3、线程2
public class GetThread implements Runnable {
private Student s;
public GetThread(Student s) {
this.s = s;
}
@Override
public void run() {
while (true) {
synchronized (s) {
// 判断没有值,就等待
if (!s.flag) {
try {
s.wait(); //t2在这等待了。
//t2线程在这里等待,那么,它就会释放锁对象。
//将来,当它再次获取到执行权的时候,是从哪里等待,哪里醒来。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(s.name + "---" + s.age);
//林青霞---27
// 修改标记
s.flag = false;
s.notify(); //唤醒其他的线程
}
//可能t2,可能t1
}
}
}
4、测试代码
/*
* 需求:我有一个学生,我可以对其属性设置值,我也可以获取其属性值。请用线程间通信的案例来体现。
*
* 资源:Student
* 设置线程:SetThread
* 获取线程:GetThread
* 测试类:StudentDemo
*
* 刚才的数据是大片大片出现的。我想把这个动作改进为依次出现的数据。
* 怎么办呢?
* 原理:如果我的学生属性没有值,我应该先赋值,然后才能使用。
* 如果学生的属性有值,应该使用后再赋值。
*
* 为了配合这个操作,java提供了一种机制:等待唤醒机制。
* notify()
* wait()
* 这两个方法的调用应该通过锁对象去使用。
*/
public class StudentDemo {
public static void main(String[] args) {
// 创建一个资源
Student s = new Student();
SetThread st = new SetThread(s);
GetThread gt = new GetThread(s);
Thread t1 = new Thread(st);
Thread t2 = new Thread(gt);
t1.start();
t2.start();
}
}
相关文章推荐
- java 中多线程之间的通讯之等待唤醒机制
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
- 多线程——等待唤醒机制经典实例:生产者消费者模式(优化)
- 多线程——等待唤醒机制经典实例:生产者消费者模式
- java多线程中的生产者与消费者之等待唤醒机制@Version1.0
- java多线程——线程间通信之线程等待唤醒机制
- 【我的Java笔记】多线程_等待唤醒机制(生产消费者模式)
- Java多线程知识点总结——进阶篇(七) 之 等待唤醒机制
- 黑马程序员——java多线程之死锁和等待唤醒机制
- Java---18---多线程:等待唤醒机制
- java多线程之 生产者和消费者 线程间通信 等待与唤醒机制
- java个人学习笔记18(多线程之间通信+等待唤醒机制)
- Java基础 多线程 解决安全问题 等待唤醒机制 Lock Condition interrupt join setPriority yield
- java多线程等待唤醒机制
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
- java多线程中的生产者与消费者之等待唤醒机制@Version2.0
- Java多线程之线程间通信--等待(wait)/通知(notify)机制,等待/通知之交叉备份实例
- java 多线程等待与唤醒机制
- java多线程(2):线程通信之生产者消费者模式及等待唤醒机制
- Java多线程四:线程间通信/等待唤醒机制