多线程--03

多线程之间的通讯:
多个线程对同一个资源(共享资源),每个线程对共享资源做的不同,操作不同。
多线程的通讯,生产者和消费者。
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类里面的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值