(三)多线程之间实现通讯

来源:互联网 发布:mac ps返回 编辑:程序博客网 时间:2024/06/04 00:31

多线程之间实现通讯


多线程之间如何实现通讯

什么是多线程之间通讯?

多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。

多线程之间通讯需求

案例:第一个线程写入(input)用户,另一个线程取读取(out)用户;实现读一个,写一个操作。
这里写图片描述

代码实战

共享资源源实体类

/** 共享资源源实体类 */class UserInfo {    public String userSex;    public String userName;}

输入线程资源

public class InputThread extends Thread{    private UserInfo user;    //构造函数    public InputThread (UserInfo user){        this.user=user;    }    @Override    public void run() {        int count=0;            while (true){                        if(count==1){                            user.userName="大圣";                            user.userSex="男";                        }else{                            user.userName="小红";                            user.userSex="女";                        }                        count=(count+1)%2;                    }            }    }

输出线程资源

public class OutputThread extends Thread{    private UserInfo user;//    //构造函数    public OutputThread(UserInfo user){        this.user=user;    }    @Override    public void run() {        while (true) {                System.out.println("userName:"+user.userName+"----userSex:"+user.userSex);        }    }}

运行代码:

 UserInfo user=new UserInfo();        InputThread it=new InputThread(user);        OutputThread ot=new OutputThread(user);        it.start();        ot.start();

运行结果:
这里写图片描述

注意:数据发生错乱,造成线程安全问题


解决线程安全问题

解决线程安全问题:在出现线程安全的代码块上加synchronized关键字

输入线程加上synchronized

public class InputThread extends Thread{    private UserInfo user;    //构造函数    public InputThread (UserInfo user){        this.user=user;    }    @Override    public void run() {        int count=0;            while (true){                //解决线程不安全问题,在出现线程安全的代码块上加synchronized关键字                synchronized (user) {                        if(count==1){                            user.userName="大圣";                            user.userSex="男";                        }else{                            user.userName="小红";                            user.userSex="女";                        }                        count=(count+1)%2;                    }            }    }

输出线程资源加上synchronized

public class OutputThread extends Thread{    private UserInfo user;//    //构造函数    public OutputThread(UserInfo user){        this.user=user;    }    @Override    public void run() {        while (true) {            //解决线程不安全问题,在出现线程安全的代码块上加synchronized关键字            synchronized (user) {                System.out.println("userName:"+user.userName+"----userSex:"+user.userSex);            }        }    }}

运行结果:
这里写图片描述

可以看到,没有出现信息错乱的情况了!