CODE_JAVA

线程

线程的状态

  1. 创建状态:调用new方法产生一个线程对象后、调用start方法前所处的状态。当线程处于创建状态时,可以使用start方法进入可运行状态,也可以使用stop方法进停止状态。
  2. 运行状态:进入该状态说明线程具有了可以运行的条件,但线程不一定处于运行状态。在但处理器系统中运行多线程程序时,一个时间点只能运行一个线程。
  3. 不可运行状态:线程被挂起或者发生阻塞。
  4. 退出状态:一个线程可以从任何一个状态中调用stop方法进入退出状态。线程一旦进入退出状态就不存在了,不能再返回到其它状态。除此之外当一个线程执行完run方法,也会进入退出状态。
  5. 在每一个特定的时间点上,每一个系统处理器只能运行一个线程。
  6. 如果线程进入不可执行状态,需要通过resume、notify等方法返回到可执行状态。
  7. suspend和resume方法的替代方法是wait和sleep。线程的退出通常是采用自然终止的方法,建议不要人工调用stop方法。
  8. join。从字面上来看就是让这个线程加入进来。如果没有参数的话需要等到该线程执行完毕才会向下执行。如果是有参数的话,就不管你有没有执行完毕我都会向下执行,我都仅仅是等待你那些时间而已。http://blog.csdn.net/dwood01/article/details/8133769
  9. 在Java中,CPU的使用通常是抢占式调度模式不需要时间片分配进程。抢占调度模式是指许多线程同时处于可运行状态,但只有一个线程正在运行。当线程一直运行到结束、进入不可执行状态、更高优先级的线程变成可运行状态,它将会让出CPU。
  10. Java中通过消息实现通信,wait()、notify()、notifyAll()方法可完成线程间的消息传递。
  11. 将方法声明为同步;对于同步块,只有该方法获得对象的锁时才能够执行。
  12. 当两个并发线程访问同一个对象的synchronized(o)同步代码块的时,一段时间内只能有一个线程在运行。另外的线程必须等到当前线程执行完同步代码块释放锁后,获得所得线程才能够执行同步代码块。对方法中的局部变量进行同步是没有任何效果的。
  13. Java中同一个文件中如果想写多个类的话,只能有一个类被声明为public。

异常

什么是异常

JAVA中的异常是一个对象,描述了代码中出现异常的情况。在代码运行异常时,在有异常的方法中创建并抛出一个表示异常的对象,然后在相应的异常吹了模块中进行处理

分类

RunTimeException主要用来描述编程产生的错误。对于Exception类中的异常,除了RuntimeException以外其它的类在程序中出现是必须被处理的,而不像RuntimeException中的异常会由系统自己处理。

THROW

  • 语句抛出异常
  • 语句抛出Exception的时候需要在方法体上使用Throws抛出异常才可以。
  • 语句抛出其它的异常的使用,不用再方法体上使用Throw是抛出异常就可以。
    ​ Exception var=new Exception(String message);
    var.getMessage();
    //首先构造一个带有信息的异常,然后使用getMessage获得到这个异常的信息。

THROWS

  • 方法头使用,抛出异常

系统自动抛出异常


注意

  • 如果是捕捉IO输入输出流中的异常,一定要在try{…}catch{…}后加finally{…}把输入输出流关闭;
  • 如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理;
  • 在捕捉异常的try{…}语句块中,如果出现了异常,则该语句(出现异常的语句)后的程序语句都不执行,而是跳到catch{…}语句块中执行异常的处理。
  • 如果一个函数没有用throws进行抛异常,在调用该函数的方法也同样可以捕捉异常。

查看字节码

  • 节码使用javap -verbose -private xxxx输出查看。

写一个方法,这个方法又抛出异常的可能性,最好的办法就是把对异常的处理留给方法的调用者。
throws是隐式抛出异常。
throw使用异常的再次抛出。异常的再次抛出是指当捕获到异常的时候并不对他进行直接处理而是把它抛出,留给上一层进行处理。


RuntimeException类的子类通常指一些运行时错误引起的异常,多以可以不处理它,同时Error错误是无法处理的。所以把它们统称为未检查异常。而剩下的异常类则被称为检查异常。对于未检查异常在使用throw抛出时不需要使用Throws进行声明,但是对于检查异常需要使用throws进行声明。


绘制图形

  1. 单独的一个组件无法显示出来,只有添加到容器中才能够显示出来。
  2. 为了实现容器中跨平台的特性、组件的大小改变、位置转移等动态特性,Java提供了布局管理器处理机制。布局管理器可以实现容器内部组件的排列顺序、大小、位置、以及窗口大小变化。
  3. 容器中组件的大小和位置都是委托给布局管理器进行管理的,程序员无法设置这些属性。如果已经设置布局管理器在容器中,使用Java语言提供的setocation()、setSize()、、setBounds()等方法不会起到任何作用。
  4. 如果用户必须设置组件的大小和位置。则必须设置容器布局管理器为空,方法为:setLayout(null);

句柄 HANDLE

含义

  1. 句柄是一种特殊的智能指针。
  2. 整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节长的数值,来标识应用程序中的不同对象和同类中不同的实例。
  3. 句柄的本质:一个唯一的整数,作为对象的身份id,区分不同的对象,和同类中的不同实例。程序可以通过句柄访问对象的部分信息。句柄不代表对象的内存地址。

    句柄简单例子

         每种编程语言都有自己的数据处理方式。有些时候,程序员必须时刻留意准备处理的是什么类型。您曾利用一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(C 或C++里的指针)?所有这些在Java 里都得到了简化,任何东西都可看作对象。注意,尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle)。还可看到有的人将其称作一个“引用”,甚至一个“指针”。可将这一情形想象成用遥控板(句柄)操纵电视机(对象)。只要握住这个遥控板,就相当于掌握了与电视机连接的通道。但一旦需要“换频道”或者“关小声音”,我们实际操纵的是遥控板(句柄),再由遥控板自己操纵电视机(对象)。如果要在房间里四处走走,并想保持对电视机的控制,那么手上拿着的是遥控板,而非电视机。此外,即使没有电视机,遥控板亦可独立存在。也就是说,只是由于拥有一个句柄,并不表示必须有一个对象同它连接。所以如果想容纳一个词或句子,可创建一个String 句柄:String s;但这里创建的只是句柄,并不是对象。若此时向s 发送一条消息,就会获得一个错误(运行期)。这是由于s 实际并未与任何东西连接(即“没有电视机”)。因此,一种更安全的做法是:创建一个句柄时,记住无论如何都进行初始化:String s = “asdf”;然而,这里采用的是一种特殊类型:字串可用加引号的文字初始化。通常,必须为对象使用一种更通用的初始化类型。