线程通信:就是多个线程操控一个对象,但一个线程的运行需要依赖接收另一个线程的信息才能开始运行。
下面我们以厂家和消费者为例简单介绍:
主要需求:
厂家:当有消费者时厂家开始工作,没有消费者厂家等待,
消费者:厂家有货时,开始消费,没有货时等待
实现思想:
1:建立一个全局的“货”对象,可以让厂家和消费者调用,但为了两者操纵的是同一个对象,单独建一个类,供两者调用
2:消费者:利用有参构造方法接受参数,判断是否有货。有的话就接收输出,没有就等待。
3:厂家:利用有参构造方法传递参数,判断是否有货,有的话等待,没有就创建货物。
4:创建货物对象、创建两个线程,并把货物对象传给线程。
5:由于要判断是否有货,所以要将boolea放到单独的货物类中;
主要的实现用到了以下关键词:
1:synchronized;同步锁
2:wait();等待线程方法
3:notify();唤醒线程方法
声明货物方法的代码:
public class Student {
//写到类里是全局的,方法里是局部的不能调用
String name;
int age;
boolean b;
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
创建厂家类:
利用构造方法传递参数,将判断的语句放入synchronized方法中,以保证同步运行,不会造成程序运行顺序的错乱。判断是否有货物,没有的话就开始创建货物,创建货物时也要判断是哪一个
public class Maker extends Thread{
Student s;
int num = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
}
//利用有参构造方法,
public Maker(Student s) {
this.s=s;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized(s){
//如果没人买就暂停,默认是flase
if(s.b){
try {
s.wait();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
s.b=true;
s.notify();
//判断是第几个
if(num%2==0){
s.age=20;
s.name="生产者";
}else {
s.name="消费者";
s.age=30;
}
}
num++;
}
}
}
消费者代码:
消费者应该判断如果是true的话,就激活线程并输出。
public class Buyer extends Thread{
Student s;
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public Buyer(Student s){
this.s=s;
}
@Override
public void run() {
while(true){
synchronized(s){
if(!s.b)
try {
s.wait();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
s.b=false;
s.notify();
System.out.println(s.name+s.age);
}
}
}
}
常见货物对象和线程:
创建Studeng对象,以供消费者和厂家调用,开启线程
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s = new Student();
Buyer b = new Buyer(s);
Maker m = new Maker(s);
b.start();
m.start();
}
结语:这周就到这了,简单写了一下关于多线程通信,以后每周还会定时的。欢迎关注!!!

1万+

被折叠的 条评论
为什么被折叠?



