共计 1206 个字符,预计需要花费 4 分钟才能阅读完成。
1、线程间通信
针对同一个资源的操作有不同种类的线程
举例:卖票有进的,也有出的。
通过设置线程 (生产者) 和获取线程 (消费者) 针对同一个学生对象进行操作
线程间通信的代码改进
通过等待唤醒机制实现数据依次出现
把同步代码块改进为同步方法实现
线程的状态转换图
public class GetThread implements Runnable {private Student s; | |
public GetThread(Student s) {this.s = s; | |
} | |
public void run() {while (true) {s.get(); | |
} | |
} | |
} |
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) {if (x % 2 == 0) {s.set("林青霞", 27); | |
} else {s.set("刘意", 30); | |
} | |
x++; | |
} | |
} | |
} |
public class Student {private String name; | |
private int age; | |
private boolean flag; // 默认情况是没有数据,如果是 true,说明有数据 | |
public synchronized void set(String name, int age) {// 如果有数据,就等待 | |
if (this.flag) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace(); | |
} | |
} | |
// 设置数据 | |
this.name = name; | |
this.age = age; | |
// 修改标记 | |
this.flag = true; | |
this.notify();} | |
public synchronized void get() {// 如果没有数据,就等待 | |
if (!this.flag) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace(); | |
} | |
} | |
// 获取数据 | |
System.out.println(this.name + "---" + this.age); | |
// 修改标记 | |
this.flag = false; | |
this.notify();} | |
} |
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();} | |
} |
正文完
星哥玩云-微信公众号
