线程的通信:打印机打印–不断的输入输出
package com.qianfeng.test;
/*
* 线程的通信:
* 分析:
* 需要两个线程--输入线程和输出线程
* 需要两个任务--输入任务和输出任务
* 需要一份数据
*
* 实现:打印机打印--不断的输入不断的输出
*
*/
public class Demo2 {
public static void main(String[] args) {
//1.创建数据类对象
Des des =new Des();
//创建任务类对象并绑定数据
Input input = new Input(des);
Output output = new Output(des);
//3.创建线程
Thread inputThread = new Thread(input);
Thread outputThread = new Thread(output);
//4.开启线程
inputThread.start();
outputThread.start();
}
}
//创建数据类
class Des{
String name;
String sex;
}
//创建输入任务
class Input implements Runnable{
Des des;
public Input(Des des){
this.des=des;
}
public void run() {
/*
* 分析:需要输入任务与输出任务共用一把锁,保证两个任务之间是同步的。
* 给两个任务加一把锁,锁可以是des或Object.class
*
* 不建议使用Object.class,因为Object.class应用范围太大,其它地方可能也会用到。
* 使用des最合适,因为它只被两个线程共享。
*
* 注意:只给一个任务加锁无法实现两个线程的同步。
*/
int i = 0;
while(true){
synchronized (des) {
if (i==1) {
des.name = "凤姐";
des.sex = "男" ;
}else {
des.name = "芙蓉姐姐";
des.sex = "女" ;
}
i=(i+1)%2;
}
}
}
}
//创建输出任务
class Output implements Runnable{
Des des;
public Output(Des des){
this.des=des;
}
public void run() {
while(true){
synchronized (des) {
System.out.println("姓名:"+des.name+" 性别"+des.sex);
}
}
}
}
唤醒等待机制,wait()/notify()/notifyAll()
package com.qianfeng.test;
/*
* 线程的通信:
* 分析:
* 需要两个线程--输入线程和输出线程
* 需要两个任务--输入任务和输出任务
* 需要一份数据
*
* 实现:打印机打印--一次输入一次输出
*
* 使用唤醒等待机制实现:wait()/notify()/notifyAll()等
* wait():让当前的线程进入等待的状态,他会被放入一个池子(线程池),失去了抢cpu的能力,等待唤醒。(锁--相当于给当前线程做了一个标记)
* notify():让当前的线程从等待线程唤醒,相当于从池子中取出线程。(唤醒的是同一把锁下的任意一个线程)
* notifyAll():唤醒的是同一把锁下的所有线程。
*/
public class Demo3 {
public static void main(String[] args) {
// 1.创建数据类对象
Des1 des = new Des1();
// 创建任务类对象并绑定数据
Input1 input = new Input1(des);
Output1 output = new Output1(des);
// 3.创建线程
Thread inputThread = new Thread(input);
Thread outputThread = new Thread(output);
// 4.开启线程
inputThread.start();
outputThread.start();
}
}
// 创建数据类
// 封装类的原则:是你的活你做,不是你的活不要做。
class Des1 {
String name;
String sex;
boolean flag = false;// 创建一个标识