java线程学习(二)

两个线程之间的通信:

实例:打印机打印——不断地输入,不断地输出

分析:

  1. 两个线程:输入线程,输出线程
  2. 两个任务:输入任务,输出任务
  3. 一份数据:打印的内容
public class Demo01 {
	public static void main(String[] args) {
		// 0.创建数据类型对象
		Des des = new Des();

		// 1.创建任务
		int num1 = 4;
		Input input = new Input(des);
		Output output = new Output(des);

		// 2.将任务交给线程,输入任务交给输入线程,输出任务交给输出线程
		Thread inputThread = new Thread(input);
		Thread outputThread = new Thread(output);

		// 3.开启线程
		inputThread.start();
		outputThread.start();

	}
}

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

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

	public Input(Des des) {
		super();
		this.des = des;
	} 
	
	/*
	 * 需要给输入任务和输出任务同时加一把锁,保证两个任务之间是同步的
	 * 给两个任务加一把锁:可以是des或者Object.class
	 * 分析:
	 * 不建议使用Object.class:由于Object的使用范围太大,可能造成不必要的错误.
	 * 使用des最合适,因为他只被当前的两个任务共享.
	 * 
	 *注意:对于当前的情况只给一个线程加锁,无法实现两个线程的同步.
	 */
	public void run() {
		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) {
		super();
		this.des = des;
	}

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

 

将上面两个线程实现同步:

public class Demo02 {
	public static void main(String[] args) {
		// 0.创建数据类对象
		Des1 des = new Des1();

		// 1.创建任务
		Input1 input = new Input1(des);
		Output1 output = new Output1(des);

		// 2.将任务交给线程
		Thread inputThread = new Thread(input);
		Thread outputThread = new Thread(output);

		// 3.开启线程
		inputThread.start();
		outputThread.start();
	}
}

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

	boolean flag = false; //创建一个标识,控制等待与唤醒之间的切换
	
	// 处理输入
	public synchronized void setData(String name, String sex) {
		if (flag= true) {//当flag值位true的时候,让输入线程处于等待状态
			try {
				//在执行代码的时候,这里对应的是哪个线程,锁对象操作的就是哪个线程
				wait();//失去抢cpu能力
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}
		this.name = name;
		this.sex = sex;
		
		//将标识改成true
		flag = ! flag;
		
		//将输出线程唤醒
		//在唤醒的时候,在线程池中没有找到当前锁标记的线程,那我们就称为空唤醒,程序允许空唤醒
		notify();
		
	}

	// 处理输出
	public synchronized void getData() {
		if (flag==false) {//当flag值位false的时候,让输出线程处于等待状态
			try {
				wait();
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}
		
		System.out.println("姓名:" + name + "    性别:" + sex);
		
		flag = !flag;
		
		notify();//唤醒输入线程
	}
}

// 创建输入任务
class Input1 implements Runnable {
	Des1 des;

	public Input1(Des1 des) {
		super();
		this.des = des;
	}

	public void run() {
		int i = 0;
		while (true) {
			if (i == 1) {
				des.setData("特没谱", "男");
			} else {
				des.setData("安倍小三", "女");
			}

			i = (i + 1) % 2;
		}
	}
}

// 输出任务
class Output1 implements Runnable {
	Des1 des;

	public Output1(Des1 des) {
		super();
		this.des = des;
	}

	public void run() {
		while (true) {
			des.getData();
		}
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值