week4

本周是java编程课学习的第四周,这周主要学习的知识点为io、多线程、网络编程、XML与JSON

集合快递柜任务


                                                                                                图1,集合快递柜部分代码

用集合去编写快递柜任务后最大的感受是在存取数据时大量使用ArrayList,虽然视频里面说过ArrayList增删慢,用于查找数据快,用于编写快递柜应该是没什么问题,但后续的任务估计就不能过于依赖ArrayList。

IO


                                                                                                             IO流概述

IO在java中使用最多的便是IO流,这可以理解为是数据的流动,即为数据传输,根据方向可分为输入与输出流,根据数据类型则可以分为字节流与字符流,而其中一般常用的是文件输出流,即读取电脑中的文件,然后读取并输出文件中的内容,而其中最常使用的采用字符流的方式,因为好比汉字在传输时,记事本中的一个汉字占据3个字节,可能会导致乱码的现象发生。

字符流构造方法

 

                                                                                                      字符流构造方法

而字符流又分为Print(打印流)与BufferReader(缓存读取流)

Print

 

                                                                                                         打印流示例

BufferReader

 

                                                                                                      缓存读取流示例

Try-With-Resources

 

                                                                                               Try-With-Resources示例

本质相当于IO中的异常处理。

多线程

进程与线程概述

进程与线

进程是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间线程。

线程是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行。一个进程最少有一个线程。线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可划分成若干个线程。

线程调度

分时调度

所有线程轮流使用CPU的使用权,平均分配每个线程暂用CPU的时间。

抢占式调度

优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度

CPU使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核新而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是 在同一时刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。

同步与异步

同步:排队执行,效率低但安全。

异步:同时执行,效率高但是数据不安全。

并发与并行

并发:指两个或多个事件在同一个时间段内发生。

并行:指两个或多个事件在同一时刻发生(同时发生)。

多线程的实现

继承Thread


 

                                                                                   用Thread与Runnable分别实现线程运行

Runnable相较于Thread的优势

实现Runnable与继承Thread比有如下优势* 1.通过创建任务,然后给线程分配的方式来实现的多线程,更适合多个线程同时执行相同任务的情况。* 2.可以避免单继承所带来的局限性(接口是实现,java中可以多实现,不能多继承。)* 3.任务与线程本身是分离的,提高了程序的健壮性。* 4.后面学习的线程池技术,只接受Runnable类型的任务,而不接收Thread类型的线程。*

    线程的休眠


常用于定时输出数据。


线程的阻塞与中断

线程的阻塞可用于指包括读取文件,获取用户键盘键入等一系列耗时较长的操作。

而线程的中断则是另一个概念,它具体指线程通过标记的方式自行决定是否结束线程。


守护线程

线程分为守护线程与用户线程

用户线程:当一个进程不包括任何的存活用户线程时,进行结束线程操作。

守护线程:守护用户线程,当最后一个用户线程结束时,所有守护线程自动死亡。

线程不安全问题

当两个或以上的线程同时执行同一个任务时,去争抢同一个数据,导致数据异常。

这时通常有3种方式解决。

方法一:同步代码块。


方法二:同步方法。


这一方法主要是通过synchronized修饰方法,使各线程在调用这一方法时排队调用。但需注意,调用该方法的线程必须是同一对象,这样才能保证是同一把锁。

方法三:显示锁


线程死锁

多个线程同时被阻塞,它们中的一个或全部都在等待某个资源被释放,导致线程被无限地阻塞,因此程序不能正常终止。

线程的六种状态(仅做了解,用于理解线程运行。)


带返回值的Callable(实现进程的第三种方式)


线程池(仅做了解)

若并发线程的数量很多,并且每个线程均执行很短的任务便结束了,这样会极大降低系统的效率,这时便需要一个可以容纳多个线程的容器,即线程池。

常用线程池可分为缓存线程池、定长线程池、单线程线程池、周期性任务定长线程池。

Lambda表达式



网络编程

这一部分内容主要为服务器与客户端的通信问题,在此举一个例子进行展示。

服务器


客户端



XML与JSON

两者均是数据格式,常用于配置文件。学习重点为两者的语法以及JSON的解析

XML语法

1. XML文档声明 

2. 标记 ( 元素 / 标签 / 节点)

XML文档,由一个个的标记组成.

语法:

开始标记(开放标记): <标记名称>

结束标记(闭合标记):

标记名称: 自定义名称,必须遵循以下命名规则:

1.名称可以含字母、数字以及其他的字符

2.名称不能以数字或者标点符号开始

3.名称不能以字符 “xml”(或者 XML、Xml)开始

4.名称不能包含空格,不能包含冒号(:)

5.名称区分大小写

标记内容: 开始标记与结束标记之间 ,是标记的内容.

例如,我们通过标记, 描述一个人名:

李伟杰

3. 一个XML文档中, 必须有且且仅允许有一个根标记. 

正例:

张三

李四

反例:

李四

麻子

4. 标记可以嵌套, 但是不允许交叉.

正例:

李四

18

反例:

李四

18

5. 标记的层级称呼 (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记)

例如:

李四

180cm

李四

200cm

name是person的子标记.也是person的后代标记

name是persons的后代标记.

name是length的兄弟标记.

person是name的父标记.

persons是name的祖先标记.

6. 标记名称 允许重复

7. 标记除了开始和结束 , 还有属性.

标记中的属性, 在标记开始时 描述, 由属性名和属性值 组成.

格式:

在开始标记中, 描述属性.

可以包含0-n个属性, 每一个属性是一个键值对!

属性名不允许重复, 键与值之间使用等号连接, 多个属性之间使用空格分割.

属性值必须被引号引住.

案例:

李四

18

李四

20

8. 注释

注释不能写在文档文档声明前

注释不能嵌套注释

格式:

注释开始:

注释结束: -->


JSON语法

一本书

书名

简介

java

class Book{

private String name;

private String info;

get/set...

}

Book b = new Book();

b.setName(“金苹果”);

b.setInfo(“种苹果”);

...

js:

var b = new Object();

b.name = "金苹果";

b.info = "种苹果";

XML:

金苹果

种苹果

JSON:

{

"name":"金苹果",

"info":"种苹果"

}

一个对象, 由一个大括号表示.

括号中描述对象的属性. 通过键值对来描述对象的属性

(可以理解为, 大括号中, 包含的是一个个的键值对.)

格式:

键与值之间使用冒号连接, 多个键值对之间使用逗号分隔.

键值对的键应使用引号引住(通常Java解析时, 键不使用引号会报错. 而JS能正确解

析.)

键值对的值, 可以是JS中的任意类型的数据 。

你可能感兴趣的:(week4)