什么是线程通信、如何实现?
所谓线程通信就是线程间相互发送数据,线程通信通常通过共享一个数据的方式实现。
线程间会根据共享数据的情况决定自己该怎么做,以及通知其他线程怎么做。
线程通信常见模型
生产者与消费者模型:生产者线程负责生产数据,消费者线程负责消费数据。
要求:生产者线程生产完数据后,唤醒消费者,然后等待自己;消费者消费完该数据后,唤醒生产者,然后等待自己
public class 多线程_5线程通信 extends Thread{
public static void main(String[] args) {
//定义线程类,创建一个共享的账户对象
account3 a=new account3("abc",0);
//创建两个取钱的线程对象
new drawthread3(a,"小明").start();
new drawthread3(a,"小红").start();
//创建三个存钱的线程对象
new savethread(a,"存钱罐1号").start();
new savethread(a,"存钱罐2号").start();
new savethread(a,"存钱罐3号").start();
}
}
//存钱的线程类
class savethread extends Thread{
//接收处理的账户对象
private account3 acc;
public savethread(account3 acc,String name){
super(name);
this.acc=acc;
}
public void run(){
try {
while (true){
//存钱
acc.savemoney(100000);
//休眠2秒
Thread.sleep(2000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//取钱的线程类
class drawthread3 extends Thread{
//接收处理的账户对象
private account3 acc;
public drawthread3(account3 acc,String name){
super(name);
this.acc=acc;
}
public void run(){
try {
while (true){
//取钱
acc.drawmoney3(100000);
//休眠2秒
Thread.sleep(2000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class account3{
private String cartId;
private double money;//账户余额
public account3() {
}
public account3(String cartId, double money) {
this.cartId = cartId;
this.money = money;
}
public String getCartId() {
return cartId;
}
public void setCartId(String cartId) {
this.cartId = cartId;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public synchronized void savemoney(double money) {
//先获取是谁来存钱,线程名即是人名
String name=Thread.currentThread().getName();
//判断账户是否有钱
try {
if(this.money==0){
//没钱,存钱
this.money+=money;
System.out.println(name+"来存钱,存了:"+money+"存钱后余额为:"+this.money);
//有钱了
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}else {
//有钱,不存钱
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void drawmoney3(double money) {
//先获取是谁来取钱,线程名即是人名
String name=Thread.currentThread().getName();
try {
//判断账户是否够钱
if(this.money>=money){
//有钱,取钱
this.money-=money;
System.out.println(name+"来取钱成功,取了:"+money+"余额是:"+this.money);
//没钱了
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}else{
//余额不足
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上就是Java实现线程通信的案例讲解的详细内容,更多关于Java线程通信的资料请关注编程网其它相关文章!