1.awt中关闭Frame窗口事件:

addWindowListener(new WindowAdapter(){   //关闭事件处理
                public void windowClosing(WindowEvent e){
                    setVisible(false);
                    System.exit(0);  //程序关闭
                }
            });

2.流对数据提供了顺序存取,这对于网络应用特别有用,因为网络应用通常都是面向流的。存储在硬盘(而不是流式磁带机)上的文件无需顺序存储,Java提供了一个RandomAccessFile类可以随机存取文件。

3.线程是独立于其他线程运行的程序执行单元。Java程序可能包括多个执行线程,即使主机实际上只有一个单CPU,这些线程也会表现得好像在独立的(多个)CPU上运行一样。

(1)java.lang.Runnable接口定义了一个run()方法,作为线程执行的代码块。此方法退出时,线程即停止运行。

(2)java.lang.Thread类表示一个线程;它为设置和查询线程特性(如执行优先级)以及开始一个线程的执行分别定义了方法。

(3)synchronized语句和修饰符可用于写一些特殊的代码块或完整方法,在执行这些代码块或方法之前要求线程得到一个锁。这种机制可以确保两个线程不会同时运行代码块或方法,从而避免不同线程将共享数据置于不一致状态。

(4)java.lang.Object的wait()和notify()方法可用于挂起线程以及再次将其唤醒。

(5)Thread.yield()  //每个线程运行一段后为其他进程提供一个运行机会,这样使得优先级相同的其他进程不会“饿死”

例1:展示了如何定义、操纵和运行线程的简单程序

 4.如果多个线程可以同时改变一个对象的状态,通常必须使用synchronized方法或synchronized语句,以确保一次只有一个线程修改对象的状态。如果未能做到,两个线程最终就会覆盖对方所做的编辑,而致使对象处于不一致的状态。

同步也会带来问题,当两个或多个线程都在等待获得锁,而锁目前正由另外某个正在等待的线程所拥有,此时就出现了死锁。要避免死锁,可以要求所有线程都按同样的顺序获得其所需的所有锁。

例2:演示了编写多线程程序的错误做法,此程序故意在两个线程间制造了死锁。

5.设计一个可能用于并发程序的类,这样一个类的实例可能同时由多个线程使用,此时,一定要确保此类事线性安全的。保证线程安全的方法之一:避免多个线程并发访问一个实例的内部状态。因为java设计本身就融入了线程,因此java语言提供了synchronized修饰符,其作用就是保证不会由多个线程并发访问一个实例的内部状态。一个实例方法声明为synchonized时,一个线程在调用此方法之前必须得到该实例的一个锁。如果其锁已经被另外一个线程所拥有,那么前一个线程就要阻塞,直到可以得到其需要的锁为止。这样可以确保一次只有一个线程可以调用实例的任何同步方法。

例3: