🦛
type
status
date
slug
summary
tags
category
icon
password
Property
Java语言内置了多线程支持。当Java程序启动的时候,实际上是启动了一个JVM进程,然后,JVM启动主线程来执行
main()
方法,在main()
方法中又可以启动其他线程。要创建一个新线程非常容易,需要实例化一个
Thread
实例,然后调用它的start()
方法:这个线程启动后实际上什么也不做就立刻结束了。
我们希望新线程能执行指定的代码,有以下几种方法:
方法一:从
Thread
派生一个自定义类,然后覆写run()
方法方法二:创建
Thread
实例时,传入一个Runnable
实例🦥
type
status
date
slug
summary
tags
category
icon
password
Property
很多Java程序启动的时候,都需要读取配置文件,例如从一个
.properties
文件中读取配置:这段代码要正常执行,必须在C盘创建
conf
目录,然后在目录里创建default.properties
文件。但是,在Linux系统上,路径和Windows的又不一样。因此,从磁盘的固定目录读取配置文件,不是一个好的办法。有没有路径无关的读取文件的方式呢?
Java存放
.class
的目录或jar包也可以包含任意其他类型的文件,例如:- 配置文件,例如
.properties
;
- 图片文件,例如
.jpg
;
- 文本文件,例如
.txt
,.csv
;
- ……
从classpath读取文件就可以避免不同环境下文件路径不一致的问题:如果把
default.properties
文件放到classpath中,就不用关心它的实际存放路径。🦛
type
status
date
slug
summary
tags
category
icon
password
Property
使用
ReentrantLock
比直接使用synchronized
更安全,可以替代synchronized
进行线程同步。但是,
synchronized
可以配合wait
和notify
实现线程在条件不满足时等待,条件满足时唤醒,用ReentrantLock
我们怎么编写wait
和notify
的功能呢?答案是使用
Condition
对象来实现wait
和notify
的功能。我们仍然以
TaskQueue
为例,把前面用synchronized
实现的功能通过ReentrantLock
和Condition
来实现:可见,使用
Condition
时,引用的Condition
对象必须从Lock
实例的newCondition()
返回,这样才能获得一个绑定了Lock
实例的Condition
实例。Condition
提供的await()
、signal()
、signalAll()
原理和synchronized
锁对象的wait()
、notify()
、notifyAll()
是一致的,并且其行为也是一样的:await()
会释放当前锁,进入等待状态;
signal()
会唤醒某个等待线程;
signalAll()
会唤醒所有等待线程;
- 唤醒线程从
await()
返回后需要重新获得锁。
type
status
date
slug
summary
tags
category
icon
password
Property
遍历
Array
可以采用下标循环,遍历Map
和Set
就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable
类型,Array
、Map
和Set
都属于iterable
类型。具有
iterable
类型的集合可以通过新的for ... of
循环来遍历。用
for ... of
循环遍历集合,用法如下:for ... of
循环和for ... in
循环有何区别?for ... in
循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array
数组实际上也是一个对象,它的每个元素的索引被视为一个属性。当我们手动给
Array
对象添加了额外的属性后,for ... in
循环将带来意想不到的意外效果:for ... in
循环将把name
包括在内,但Array
的length
属性却不包括在内。🦥
type
status
date
slug
summary
tags
category
icon
password
Property
ZipInputStream
是一种FilterInputStream
,它可以直接读取zip包的内容:另一个
JarInputStream
是从ZipInputStream
派生,它增加的主要功能是直接读取jar文件里面的MANIFEST.MF
文件。因为本质上jar包就是zip包,只是额外附加了一些固定的描述文件。读取zip包
要创建一个
ZipInputStream
,通常是传入一个FileInputStream
作为数据源,然后循环调用getNextEntry()
,直到返回null
,表示zip流结束。一个
ZipEntry
表示一个压缩文件或目录,如果是压缩文件,就用read()
方法不断读取,直到返回-1
:写入zip包
ZipOutputStream
是一种FilterOutputStream
,它可以直接写入内容到zip包。我们要先创建一个ZipOutputStream
,通常是包装一个FileOutputStream
,然后,每写入一个文件前,先调用putNextEntry()
,然后用write()
写入byte[]
数据,写入完毕后调用closeEntry()
结束这个文件的打包。🍂
type
status
date
slug
summary
tags
category
icon
password
Property
实际使用 Java 开发图形界面程序时 ,很少使用 AWT 组件,绝大部分时候都是用 Swing 组件开发的 。 Swing是由100%纯 Java实现的,不再依赖于本地平台的 GUI, 因此可以在所有平台上都保持相同的界面外观。独立于本地平台的Swing组件被称为轻量级组件;而依赖于本地平台的 AWT 组件被称为重量级组件。 由于 Swing 的所有组件完全采用 Java 实现,不再调用本地平台的 GUI,所以导致 Swing 图形界面的显示速度要比 AWT 图形界面的显示速度慢一些,但相对于快速发展的硬件设施而言,这种微小的速度差别无妨大碍。
使用Swing的优势:
- Swing 组件不再依赖于本地平台的 GUI,无须采用各种平台的 GUI 交集 ,因此 Swing 提供了大量图形界面组件 , 远远超出了 AWT 所提供的图形界面组件集。
- Swing 组件不再依赖于本地平台 GUI ,因此不会产生与平台 相关的 bug 。
- Swing 组件在各种平台上运行时可以保证具有相同的图形界面外观。
Swing 提供的这些优势,让 Java 图形界面程序真正实现了 " Write Once, Run Anywhere" 的 目标。
Swing的特征:
- Swing 组件采用 MVC(Model-View-Controller, 即模型一视图一控制器)设计模式:
type
status
date
slug
summary
tags
category
icon
password
Property
什么是JSON,有什么用?
JavaScript Object Notation(JavaScript对象标记),简称JSON(数据交换格式)
JSON主要的作用是:一种标准的数据交换格式(目前非常流行,90%以上的系统,系统A与系统B交换数据的话,都是采用JSON)
JSON是一种标准的轻量级的数据交换格式。特点是:
体积小,易解析。
在实际的开发中有两种数据交换格式,使用最多,其一是JSON,另一个是XML
XML体积较大,解析麻烦,但是有其优点是:语法严谨。(通常银行相关的系统之间进行数据交换的话会使用XML)