什么是线程之前的通信?
多线程之前的通信,其实就是多个线程在操作同一个资源,但是操作动作不同
如图所示
多线程之间通讯需求
需求如下:第一个线程写入(input)用户,另一个线程读取(out)用户,实现读一个,写一个操作。
源码如下:源码中包含着线程安全的解决方法 wait和notify的用法
package com.zuojie;
/**
* 共享资源
* @author zuojie
*
*/
public class Common {
public String name;
public String sex;
//flag为true表示common已经读取值,flag为false out线程未读取值
public boolean flag=false;
}
package com.zuojie;
/**
*
* 写入线程
* @author zuojie
*
*/
public class InputThread extends Thread{
public Common common;
public InputThread(Common common) {
this.common=common;
}
@Override
public void run() {
int count=0;
while(true) {
synchronized (common) {
if(common.flag) {
//当前线程等待 wait();类似于sleep可以让当前线程,从运行状态变为休眠状态
//wait使用在多线程之间的同步 和synchronied一起使用
try {
common.wait();
}catch(Exception e) {
}
}
if(count==0) {
common.name="zuojie";
common.sex="男";
}else {
common.name="小二";
common.sex="女";
}
//实现基数和偶数
count=(count+1)%2;
common.flag=true;
common.notify();
}
}
}
}
package com.zuojie;
/**
* 读取线程
* @author zuojie
*
*/
public class OutputThread extends Thread{
public Common common;
public OutputThread(Common common) {
this.common=common;
}
@Override
public void run() {
while(true) {
synchronized (common) {
if(!common.flag) {
try {
common.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(common.name + "------" + common.sex);
common.flag=false;
common.notify();
}
}
}
}
package com.zuojie;
public class ThreadDemo01 {
public static void main(String[] args) {
Common commo=new Common();
InputThread input= new InputThread(commo);
OutputThread output = new OutputThread(commo);
input.start();
output.start();
}
}