Java——线程通信

Java——线程通信

线程通信中的三个方法:
  • wait()   将当前进程挂起,释放CPU,进入等待队列
  • notify()   将线程等待队列中优先级最高的线程唤醒
  • notifyAll()  将等待队列中的所有线程唤醒
注°只能在同步代码块或者同步方法中使用
1、使用线程通信使得两个账户交替存钱
package com.kexin.study2;

public class TestCommunication {

	public static void main(String[] args) {
		Account acc = new Account();
		User user1 = new User(acc);
		User user2 = new User(acc);
		
		user1.setName("甲");
		user2.setName("乙");
	
		user1.start();
		user2.start();
	}

}
class Account{
	private double money;
	public synchronized void setMoney(double money){
		//将线程唤醒
		notify();
		this.money += money;
		System.out.println(Thread.currentThread().getName()+"---->"+this.money);
		try {
			//将线程挂起
			wait();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
class User extends Thread{
	private Account acc;
	public User(Account acc){
		this.acc = acc;
	}
	@Override
	public void run() {
		for(int i =0 ;i<3;i++)
			acc.setMoney(1000);
	}
	
}
2、生产者/消费者问题
生产者/消费者问题是讲解线程必提的一个例子,意思是生产者和消费者两个线程共享一个buffer,生产者往里生产东西,消费者从里面取东西,而两者不可同时访问这个buffer
package com.kexin.study2;

public class TestProductConsume {

	public static void main(String[] args) {
		ProductBuffer pb = new ProductBuffer();
		Product p = new Product(pb);
		Product p1 = new Product(pb);
		Consume c = new Consume(pb);
		
		p.setName("生产者");
		p1.setName("生产者1");
		c.setName("消费者");
		
		p.start();
		p1.start();
		c.start();
	}

}
//产品BUffer
class ProductBuffer{
	int product_nums = 0;	//现有的产品数
	private final int max_buffer = 5;	//设置缓冲池大小
	//生产产品
	public synchronized void setProduct(){
		if(product_nums>=max_buffer){
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			product_nums++;
			System.out.println(Thread.currentThread().getName()+"生产了第"+product_nums+"个产品");
			notifyAll();
		}
	}
	//消费产品
	public synchronized void getProduct(){
		if(product_nums<=0){
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			product_nums--;
			System.out.println(Thread.currentThread().getName()+"消费了第"+product_nums+"个产品");
			notifyAll();
		}
	}
}
//生产者线程
class Product extends Thread{
	ProductBuffer buffer;
	public Product(ProductBuffer buffer){
		this.buffer = buffer;
	}
	@Override
	public void run() {
		//生产者生产产品
		System.out.println("生产者生产产品...");
		while(true){
			buffer.setProduct();
		}
	}
	
}
//消费者线程
class Consume extends Thread{
	ProductBuffer buffer;
	public Consume(ProductBuffer buffer){
		this.buffer = buffer;
	}
	@Override
	public void run() {
		//消费者消费产品
		try {
			Thread.currentThread().sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("消费者消费产品...");
		while(true){
			buffer.getProduct();
		}
	}
}
线程over了 大笑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄鸭and小黑鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值