您的位置:首页 > 其它

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

2017-12-13 11:32 429 查看

多线程之间实现通讯

多线程之间如何实现通讯

什么是多线程之间通讯?

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

多线程之间通讯需求

案例:第一个线程写入(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);
}
}
}

}


运行结果:



可以看到,没有出现信息错乱的情况了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: