IT form整理 java应该注意的问题3(异常+多线程)

12,运行时异常与一般异常有何异同

(1)运行时异常属于程序缺陷造成的,是设计或实现上的问题,即,如果程序设计良好,这类异常便不会发生;该类异常在语法上不强制程序员必须处理,成为非受检异常。

常见的非受检异常:

ClassCastException/ 类型转换不兼容

ArrayIndexOutOfBoundException 数组下标越界

NullPointerException 尝试访问null对象的成员

ArithmeticException 算术异常

IllegalArgumentException 方法接受到的非常参数

NumberFormatException 数字转换格式异常

(2)非运行时异常

该类异常属于程序外部问题引起的异常。在语法上要求必须进行处理,如果不处理,会出现语法错误,不能通过编译器的编译,称为受检异常。

常见的受检异常:

ClassNotFoundException 要加载的类没有找到

IOException I/O异常的根类

FileNotFoundException 要操作的文件未找到

SQLException 有关数据库操作时的异常

InterrupedException 线程中断

Error 属于JVM需要承担的责任。大多数错误与编写的代码无关,一般是指虚拟机内部出现的问题。

13,JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally。throw和throws都是抛出异常的,但塔门有区别:throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法声明中指明要跑出的异常;如果要捕捉throw抛出的异常,则必须使用try—catch语句。可见,throw可以主动抛出异常,也就是可以在try中抛出异常。

14,java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?..

有两种实现方法,分别是继承Thread类与实现Runnable接口用synchronized关键字修饰同步方法反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态(假如一个方法在将钱从一个账户转移到另一个账户的过程中,在取款之后存款之前就停止了。那么现在银行对象就被破坏了。因为锁已经被释放了。)那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。

suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。

15,sleep()和 wait() 有什么区别?.

(1)这两个方法来自不同的类分别是Thread和Object

(2)最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

(3)wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在

  任何地方使用(使用范围)

  synchronized(x){

  x.notify()

  //或者wait()

  }

(4)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

16,同步和异步有何异同,在什么情况下分别使用他们?举例说明。

(1)如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

(2)简单地说就是同步会等待,异步不会等待。同步可以这样理解:使用同一个类产生的多个线程对象,可以同时分别执行对象中的方法,这在同时存取相同的资源时可能产生错误。当类在的方法设为synchronized时,在同一时刻只能有一个线程对象执行这个方法,其它想要执行这个方法的线程,必须等到它空闲时才能开始执行。

17,多线程有几种实现方法?同步有几种实现方法?

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 ;同步的实现方面有两种,分别是synchronized,wait与notify

18,启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。

19,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

(1)一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法。

(2)一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。

(3)一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法

public class TEST {public static void main(String[] args) {TEST tc = new TEST();Thread1 t1 = tc.new Thread1(tc);t1.start();Thread2 t2 = tc.new Thread2(tc);t2.start();}class Thread1 extends Thread{TEST tc = null;public Thread1(TEST tc) {this.tc = tc;}public void run() {tc.method1();}}class Thread2 extends Thread{TEST tc = null;public Thread2(TEST tc) {this.tc = tc;}public void run() {tc.method1();}}public synchronized void method1(){System.out.println("method1");try {Thread.sleep(1000*10);} catch (InterruptedException e) {e.printStackTrace();}}public void method2(){System.out.println("method2");}}

可以通过以上代码,在method2前面加或不加Synchronized关键字来测试;然后用两个run方法同时或不同时调用method1和method2

20,简述synchronized和java.util.concurrent.locks.Lock的异同?

主要相同点:Lock能完成synchronized所实现的所有功能主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。在Java SE1.5之后, java 提供了另外一种显式加锁的机制,即使用java.util.concurrent.locks.Lock接口提供 的lock方法来获取锁,用unlock方法来释放锁。

黑夜下,撕开那张面具尽是怠倦的容颜,

IT form整理 java应该注意的问题3(异常+多线程)

相关文章:

你感兴趣的文章:

标签云: