多线程
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
线程的生命周期
线程被创建并启动以后要经历五种状态,分别是新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。
新建:使用关键字new创建一个线程后,处于新建状态,此时仅由虚拟机为其分配内存并初始化成员变量,程序不会执行线程执行体。
就绪:当线程对象调用start()方法后,该线程处于就绪状态,虚拟机为其创建调用栈和程序计数器,但是此时线程并没有运行,只是表示线程可以运行了。
运行:当处于就绪状态的线程获得了CPU,开始执行run方法,则该线程处于运行状态。
阻塞:当发生线程调用sleep方法、阻塞式IO方法、suspend方法、等待通知(notify),线程将近阻塞状态。阻塞状态在合适的时候会重新进入就绪状态。
死亡:线程会以以下三种方式结束,然后就处于死亡状态,run方法执行完成、线程抛出未捕获的异常、直接跳跃stop方法结束进程。
线程的控制
isAlive():测试线程是否处于活动状态
isDaemo():测试进程是否为守护进程
join():等待该进程终止
sleep():在指定的毫秒数内让正在执行的线程休眠,该线程不丢失任何监视器的所属权
yield():暂停当前正在执行的线程对象,并执行其他线程,它是将线程转入就绪状态
setPriority(int newPriority):更改线程的优先级
线程的通信
Java为了避免轮询检测,通过wait()、notify()和notifyAll()方法实现进程内通信的机制。 wait():告诉调用线程放弃监控器进入等待模式直到其他线程进入同一监控器并调用notify()方法。
notify():唤醒在此同步器上等待的单个线程
notifyAll():唤醒在此同步器上等待的所有线程
JAVA系统
IO流的分类
根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流
根据数据功能不同分为:节点流和处理流
只要是处理纯文本数据,就优先考虑使用字符流;除此之外都使用字节流。
对象流:以对象为单位传输数据。使用类ObjectInputStream和ObjectOutputStream实现,以FileOutputStream和FileInputStream类进行流的中转保存。
对象的序列化:把堆中的对象转化为二进制数据的形式输出。
对象的反序列化:把二进制数据还原成堆中的对象。
序列化标示关键字:Serializable
不能被序列化的关键字:transient
序列化:就是只把一个对象串行化成一个字节流,用于网络传输或者持久化。
JAVA图像界面编程
在java中有ATW和Swing两套组件用于支持图形用户界面编程。
ATW是最早出现的,但是过于依赖操作系统,有很大弊端,AWT 是依靠本地方法来实现其功能的,所以通常把AWT组件称为重量级组件。
Swing是在ATW之上开发的。完全有java代码编写,不依赖操作系统,可以自己调节外观,使得程序员编写程序更方便。
Swing的GUI(图形用户界面)是由容器和组件组成,容器是放置组件的。
布局管理器
FlowLayout: 组件在一行中从左至右水平排列。
BorderLayout:北、南、东、西、中。
GridLayout:以行和列的网格形式安排组件
BoxLayout:更复杂、功能更强的网格布局
事件驱动编程
事件:描述发生了什么的对象。
存在各种不同类型的事件类用来描述各种类型的用户交互。
事件源:事件的产生器。
事件处理器:接收事件、解释事件并处理用户交互的方法