今日重新看了多线程,手写了一个简单的生产者消费者模型的代码,分享一下。
场景:录入学生信息和读取学生信息。将录入学生信息看作是生产者在生产数据,将读取学生信息看作是消费者在消费数据,实体学生是生产者和消费者共享的数据模型,now talk is cheap:
1 资源类
/*
* jsyuger
* 此类用于模拟资源类
*/
public class Student {
String name ;
String sex ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
2 生产者类
/*
* jsyuger
* 此类用于模拟生产者类
*/
public class SetStudent implements Runnable{
private Student student ;
public SetStudent(Student student) {
this.student = student ;
}
@Override
public void run() {
// TODO Auto-generated method stub
student.setName("jsyuger");
student.setSex("man");
}
}
3 消费者类
/*
* jsyuger
* 此类用于模拟消费者类
*/
public class GetStudent implements Runnable{
private Student student ;
public GetStudent(Student student) {
this.student = student ;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.print("我叫"+student.getName()+",性别是"+student.getSex());
}
}
4 测试类
/*
* jsyuger
* 此类用于模拟生产者消费者模型的测试类
*/
public class StudentDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1 创建资源
Student student = new Student() ;
//2 设置和获取资源
SetStudent st = new SetStudent(student) ;
GetStudent gt = new GetStudent(student) ;
//3 创建线程类
Thread t1 = new Thread(st) ;
Thread t2 = new Thread(gt) ;
//4 启动线程
t1.start();
t2.start();
}
}
控制台打印结果:
我叫jsyuger,性别是man
说明:以上仅是多线程学习的一个基础demo,简单模拟生产者消费者模型。这样设计也存在一些问题,如打印结果不稳定,有时可能会打印“我叫null,性别是null”,这是因为线程占领资源的随机性,有机会将多学习多线程编程,多多看看底层。