java线程之线程通信

时间:2023-01-28 03:56:23

前面提到多线程操作会有一个资源共享问题。

日常生活中,对于一个超市,有供货商往超市运货,有消费者从超市取货,供货商和消费者都与超市

建立了某种连接,超市就相当于公共资源,而他们的这种行为放到线程上说就是----线程通信。

建立线程通信自然少不了公共资源类、至少两个操作线程、测试类。

1.公共资源类

 public class Share {
String name;
String sex;
//线程A的任务,提供数据(同步方法)
public synchronized void product(String name,String sex) {
this.name = name;
this.sex = sex;
}
//线程B的任务,提取(显示)数据(同步方法)
public synchronized void show() {
System.out.println("姓名:"+this.name+";性别:"+this.sex );
}
}

因为供货商和消费者都会与超市建立连接,那么超市自然要知道他们各自的目的。

所以公共资源类中会定义各线程的操作方法(任务)。

2.线程A/B

 public class Producter implements Runnable {
Share share = null;
// 构造方法为此线程和公共资源对象建立连接
public Producter(Share share) {
this.share = share;
}
@Override
public void run() {
// run方法定义了线程工作时的具体操作
share.product("Tom", "男");
}
} public class Customer implements Runnable {
Share share = null;
// 构造方法为此线程和公共资源对象建立连接
public Customer(Share share) {
this.share = share;
}
@Override
public void run() {
// run方法定义了线程工作时的具体操作
share.show();
}
}

由于线程A/B都是对公共资源对象的操作,那么就必须在线程内部引入公共资源对象,为后面的线程操作(run方法)提供对象。

3.测试类(开始工作)

 public class Test {
public static void main(String[] args) {
//新建一个公共资源类对象share
Share share = new Share();
//创建线程A/B,并为其引入公共资源对象(构造器实现对象引入)
Producter product = new Producter(share);
Customer customer = new Customer(share);
//开启线程,二位开始上班
new Thread(product, "A").start();
new Thread(custmer, "B").start();
}
}

不难看出,控制台会打印出A线程传入的数据(姓名:Tom;性别:男)