java多线程:线程的通信、唤醒等待机制、生产消费者模式、Lock

线程的通信:打印机打印–不断的输入输出

package com.qianfeng.test;
/*
 * 线程的通信:
 * 分析:
 * 需要两个线程--输入线程和输出线程
 * 需要两个任务--输入任务和输出任务
 * 需要一份数据
 * 
 * 实现:打印机打印--不断的输入不断的输出
 * 
 */
public class Demo2 {

	public static void main(String[] args) {
		
		//1.创建数据类对象
		Des des =new Des();
		//创建任务类对象并绑定数据
		Input input = new Input(des);
		Output output = new Output(des);
		//3.创建线程
		Thread inputThread = new Thread(input);
		Thread outputThread = new Thread(output);
		//4.开启线程
		inputThread.start();
		outputThread.start();
		
	}
}

//创建数据类
class Des{
	String name;
	String sex;
}

//创建输入任务
class Input implements Runnable{

	Des des;
	public Input(Des des){
		this.des=des;
	}
	
	public void run() {
		/*
		 * 分析:需要输入任务与输出任务共用一把锁,保证两个任务之间是同步的。
		 * 给两个任务加一把锁,锁可以是des或Object.class
		 * 
		 * 不建议使用Object.class,因为Object.class应用范围太大,其它地方可能也会用到。
		 * 使用des最合适,因为它只被两个线程共享。
		 * 
		 * 注意:只给一个任务加锁无法实现两个线程的同步。
		 */
		int i = 0;
		while(true){
			synchronized (des) {
				if (i==1) {
					des.name = "凤姐";
					des.sex = "男" ;
				}else {
					des.name = "芙蓉姐姐";
					des.sex = "女" ;
				}
				i=(i+1)%2;
			}
		}
	}
}

//创建输出任务
class Output implements Runnable{

	Des des;
	public Output(Des des){
		this.des=des;
	}
	
	public void run() {
		while(true){
			synchronized (des) {
				System.out.println("姓名:"+des.name+"  性别"+des.sex);
			}
		}
	}
}

唤醒等待机制,wait()/notify()/notifyAll()

package com.qianfeng.test;

/*
 * 线程的通信:
 * 分析:
 * 需要两个线程--输入线程和输出线程
 * 需要两个任务--输入任务和输出任务
 * 需要一份数据
 * 
 * 实现:打印机打印--一次输入一次输出
 * 
 * 使用唤醒等待机制实现:wait()/notify()/notifyAll()等
 * wait():让当前的线程进入等待的状态,他会被放入一个池子(线程池),失去了抢cpu的能力,等待唤醒。(锁--相当于给当前线程做了一个标记)
 * notify():让当前的线程从等待线程唤醒,相当于从池子中取出线程。(唤醒的是同一把锁下的任意一个线程)
 * notifyAll():唤醒的是同一把锁下的所有线程。
 */
public class Demo3 {

	public static void main(String[] args) {

		// 1.创建数据类对象
		Des1 des = new Des1();
		// 创建任务类对象并绑定数据
		Input1 input = new Input1(des);
		Output1 output = new Output1(des);
		// 3.创建线程
		Thread inputThread = new Thread(input);
		Thread outputThread = new Thread(output);
		// 4.开启线程
		inputThread.start();
		outputThread.start();

	}
}

// 创建数据类
// 封装类的原则:是你的活你做,不是你的活不要做。
class Des1 {
	String name;
	String sex;
	boolean flag = false;// 创建一个标识࿰
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值