Java学习_Day18

今天的学习内容
一、线程间通信
二、线程池
三、Lamdba表达式

一、线程间的通信
理解:利用等待(wait)和唤醒(notify)机制,让多个线程之间达到协同合作的目的
注意:等待(wait)唤醒(notify) 都必须被锁对象调用
等待和唤醒案例(生产者和消费者)
包子类(共享资源)`

public class BaoZi{
	//皮
	String pi;
	//馅
	String xian;
	//状态  有(true)   没有(false)
	boolean flag;
} 

生产者线程(包子铺)

public class BaoziPu extends Thread{
	//共享资源(作为锁对象)
	private BaoZi bz;
	//创建对象的时候给bz对象赋值
	public BaoziPu(BaoZi bz){
		this.bz=bz;
	}
	
	@Override
	public void run(){
		int count=0; //计数器
		while(true){
			//先对包子的状态进行判断,有(等待),没有(做包子)
			synchronized(bz){
				//有包子(等待)
				if(bz.flag){
					try{
						bz.wait();
					}catch(Exception e){
						e.printStackTrace();
					}
				}
				//等待完了没有包子(做包子)
				try{
					//做包子得花费1秒钟的时间
					Thread.sleep(1000);
				}catch(Exception e){
					e.printStackTrace();
				}
				//表示做"薄皮"+"三鲜馅"的包子
				if(count%2==0){
					bz.pi="薄皮";
					bz.xian="三鲜馅"
					
				}else if(count%2==1){
					//表示做"冰皮"+"牛肉馅"的包子
					bz.pi="冰皮";
					bz.xian="牛肉馅";
				}
				count++;
				//包子做好了,改变包子的状态为有包子
				bz.flag=true;
				System.out.println(bz.pi+bz.xian+"包子做好了,吃货可以吃包子了...");
				bz.nofiy(); //唤醒顾客吃包子
			}
		}
	}
} 

消费者线程(顾客)

public class Customer extends Thread{
	private BaoZi bz;
	
	public Customer(BaoZi bz){
		this.bz=bz;
	}
	
	@Override
	public void run(){
		while(true){
			synchronized(bz){
				//如果没有包子等待,有包子吃包子
				if(!bz.flag){
					try{
						bz.wait();
					}catch(Exception e){
						e.printStackTrace();
					}
				}
				//包子做好了,就可以吃包子了
				System.out.println("顾客开始吃"+bz.pi+bz.xian+"的包子");
				bz.flag=false; //吃完包子,包子的状态给为false
				bz.notify(); //唤醒包子铺做包子
			}
		}
	}
}

测试类

public class Demo{
	public static void main(String[] args){
		BaoZi bz=new BaoZi();
		//创建包子铺线程对象,传递共享资源  “包子对象”
		BaoziPu bzp=new BaoziPu(bz);
		bzp.start();
		
		//创建顾客线程对象,传递共享资源  “包子对象”
		Customer cs=new Customer(bz);
		cs.start();
	}
}

二、线程池
JDK1.5之后就提供了线程池,方便执行线程任务
在这里插入图片描述

//第一步:获取线程池对象
	ExecutorService service=Executors.newFixedThreadPool(2); //包含2个线程的线程池

	//第二步:提交线程任务
	service.submit(new Runnable(){
		@Override
		public void run(){
			System.out.println(Thread.currentThread().getName()+"线程任务执行了");
		}
	});
	
	service.submit(new Runnable(){
		@Override
		public void run(){
			System.out.println(Thread.currentThread().getName()+"线程任务执行了");
		}
	}); 
	
	
	//第三步:销毁线程池(不建议),线程池就没有用了。
	service.shutdown();

三、Lamdba表达式
函数式接口:
只能有一个抽象方法的接口,但是可以有其他方法。
@FunctionalInterface 标记接口为函数式接口

使用Lamdba表达式的前提
1)必须要有一个函数式接口
2)Lambda表达式可以理解为函数式接口的实例实现(可以有效优化匿名内部类代码的冗余)

Lamdba表达式的格式
//标准格式
(Type1 param1,Type2 param2)->{… return 返回值;}
//省略数据类型
(param1,param2)->{… return 返回值;}
//省略{}以及return语句。 【如果语句体只有一条语句】
(param1,param2)-> 语句体;
//省略() 【如果参数只有一个,才能省略()】
param1-> 语句体;

Lamdba表达式的使用步骤

1)需要先有一个函数式接口
2)写一个方法,把函数式接口作为方法的参数
3)调用方法,传递的实际参数对函数式接口进行实现

函数式接口实现方式一:使用匿名内部类(代码冗余)
函数式接口实现方式二:使用Lamdba表达式(减少代码冗余)

//1)需要先有一个函数式接口
@FunctionalInterface
public interface Cook{
	public abstract void makeFood(); //做食物
}

//写一个测试类
public class Demo1{
	public static void main(String[] args){
		//3)调用方法,匿名内部类对函数式接口进行实现
		invokeCook(
			new Cook(){
				public void makeFood(){
					System.out.println("烹饪大米饭");
				}
			}
		);
		
		//3)调用方法,Lamdb表达式对函数式接口进行实现
		invokeCook(
			()->{
				System.out.println("烹饪小米粥");
			}
		); 
	}
	//2)写一个方法,把函数式接口作为方法的参数
	public static void invokeCook(Cook cook){
		cook.makeFood();
	}
}

lambda表达式就是简化匿名内部类的写法
上面时候用到匿名内部类并要复写里面的方法,就可以考虑使用lambda表达式来简化

Java学习第19天内容链接:
https://blog.csdn.net/LJN951118/article/details/89409936

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark 基础环境是指安装和配置 Spark 所需的软件和硬件环境。Spark 运行需要 Java 环境和 Hadoop 环境,同时也需要配置 Spark 的相关参数,如内存大小、CPU 核数等。在安装和配置好基础环境后,我们才能使用 Spark 进行数据处理和分析。 ### 回答2: Spark是一个快速、可扩展且容错的大数据处理框架,提供了丰富的API和工具,可以处理大规模的数据集。 搭建Spark基础环境包括以下几个步骤: 1. 安装Java:Spark是基于Java开发的,因此首先需要安装Java开发环境。可以从Oracle官网下载并安装适合操作系统的Java版本。 2. 下载Spark:在Apache Spark官网下载最新版本的Spark压缩包,并解压到指定目录。 3. 配置环境变量:将Spark的bin目录添加到系统的环境变量中。这样可以方便地在任意位置运行Spark的命令。 4. 配置Spark集群:如果需要在多台机器上运行Spark应用程序,需要进行集群配置。首先,在每台机器上安装好Java,并将Spark解压到相同的目录。然后,编辑Spark的配置文件,设置集群的主节点和从节点。 5. 验证安装:通过在终端运行spark-shell命令,验证Spark是否正确安装。spark-shell命令会启动一个Scala解释器,并连接到Spark集群。 6. 运行第一个Spark应用程序:编写一个简单的Spark应用程序,如WordCount,用于统计文本文件中单词的个数。将程序保存为Scala文件,并使用spark-submit命令来运行。 以上就是搭建Spark基础环境的主要步骤。搭建好Spark环境后,可以使用Spark提供的丰富API和工具来进行大数据处理和分析,如数据清洗、转换、机器学习等。Spark的功能强大且易于使用,适用于各种大规模数据处理场景。 ### 回答3: Spark是一个快速通用的集群计算系统,它提供了高效的数据处理和分析能力。要运行Spark,我们需要配置和搭建一些基础环境。 首先,我们需要安装Java JDK。Spark运行在Java虚拟机上,因此我们需要安装适当版本的Java开发工具包。通常建议使用Oracle JDK的最新稳定版本,然后设置JAVA_HOME环境变量。 其次,我们需要安装Spark本身。Spark官方网站提供了预编译的二进制发行版,我们可以从网站上下载并解压缩到我们喜欢的位置。然后,我们可以设置SPARK_HOME环境变量,以便在终端窗口中使用Spark命令。 接下来,我们需要选择一个合适的集群管理器来运行Spark应用程序,比如Standalone模式、Hadoop YARN和Apache Mesos等。我们需要根据自己的需求进行选择和配置。例如,在Standalone模式下,我们需要启动一个Spark Master和多个Spark Worker来管理和运行任务。 最后,在运行Spark应用程序之前,我们需要通过编写一个Spark应用程序来使用Spark的功能。Spark提供了Java、Scala和Python等多种编程语言的API。我们可以使用任何一种编程语言来编写应用程序并在Spark上运行。 总之,Spark基础环境搭建包括安装Java JDK、安装Spark本身、选择和配置集群管理器,以及编写Spark应用程序。搭建好这些基础环境后,我们就可以开始使用Spark进行快速、高效的集群计算了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值