多线程之间的通讯:
多个线程对同一个资源(共享资源),每个线程对共享资源做的不同,操作不同。
多线程的通讯,生产者和消费者。
wait();调用wait()方法后,是当前线程把该对象的控制权交出去,然后处于等待状态。(释放当前锁的资源。)
nitify():让当前线程从休眠状态变成运行状态。
notifyall():唤醒当前的全部线程。
创建一个共享的资源对象
package com.itmayiedu.day03;
/**
* 共享资源的线程。。
*/
public class User {
private String userName;
private String Sex;
public boolean flag = false;//设置一个标示 当前当前的状态
public String getUserName() {
return userName;
}
public String getSex() {
return Sex;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setSex(String sex) {
Sex = sex;
}
}
创建写入的操作的类:
package com.itmayiedu.day03;
public class OutThread extends Thread{
User user;
public OutThread (User user){
this.user =user;
}
@Override
public void run() {
int count = 0;
synchronized (user){
while (true){
if(user.flag){
try{
user.wait();//让当前的线程变成等待,释放锁的资源
}catch (Exception ex){
}
}
if(count==0){
user.setSex("女");
user.setUserName("账单00000");
}else {
user.setUserName("账单11111");
user.setSex("男");
}
//产生奇数和偶数的公式
count = (count+1)%2;
user.flag=true;
user.notify();//唤醒其他的线程
}
}
}
}
创建读取操作的类:
package com.itmayiedu.day03;
public class InputThread extends Thread {
User user;
public InputThread(User user){
this.user =user;
}
@Override
public void run() {
synchronized (user){
while (true){
if(!user.flag){
try{
user.wait();//使当前的线程变成等待状态,释放锁的资源。
}catch (Exception ex){
}
}
System.out.println("姓名:"+user.getUserName()+" 性别:"+user.getSex());
user.flag=false;
user.notify();
}
}
}
}
注意: 一定要在同步中使用,并且是同一个资源对象,必须是同一把锁。
当前的测试类:
package com.itmayiedu.day03;
public class TestThread {
public static void main(String[] args) {
User user = new User();
OutThread outThread = new OutThread(user);
InputThread inputThread = new InputThread(user);
outThread.start();
inputThread.start();
}
}
多线程在做通信的时候,必须使用synchronized() wait(); notify();
wait()和Sleep()的区别:
wait():用于同步中,可以释放锁的资源,wait()需要notify中才可以从休眠状态中被唤醒。该方法属于Object类中的
sleep():不会释放锁的资源,Sleep()等待时间结束,就可以直接执行了,该方法属于Thread类里面的。