异?常:★★★
异常处理原则:功能抛出几个异常,,抛几个就处理几个。?
功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性
特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。
throw?和throws关键字的区别:?
throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。?
throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。
线程的2种创建方式(必问)?
创建线程的第一种方式:继承Thread?,由子类复写run方法。?
步骤:?
1,定义类继承Thread类;?
2,目的是复写run方法,将要让线程运行的代码都存储到run方法中;?3,通过创建Thread类的子类对象,创建线程 对象;?
4,调用线程的start方法,开启线程,并执行run方法。?
线程状态:?
新建:继承Thread类或者实现Runnable接口 s
运行:具备执行资格,同时具备执行权;start()?用于开始一个线程让一个线程运行
冻结:sleep(time)线程进入休眠,wait()等待—notify()唤醒;线程释放了执行权,同时释放执行资格;?
临时阻塞状态:线程具备cpu的执行资格,没有cpu的执行权;?
消亡:stop()?
创建线程的第二种方式:实现一个接口Runnable。
?步骤:?
1,定义类实现Runnable接口。?
2,覆盖接口中的run方法(用于封装线程要运行的代码)。
?3,通过Thread类创建线程对象;?
4,将实现了Runnable接口的子类对象作为实际参数传递给Thread类中的构造函数。
?为什么要传递呢?
因为要让线程 对象明确要运行的run方法所属的对象。?
5,调用Thread对象的start方法。开启线程,并运行Runnable接口子类中的run方法。?
Ticket?t?=?new?Ticket();?
New Thread(t).start()
/*?
直接创建Ticket对象,并不是创建线程对象。?
因为创建对象只能通过new?Thread类,或者new?Thread类的子类才可以。?
所以最终想要创建线程。既然没有了Thread类的子类,就只能用Thread类。?*/?
Thread?t1?=?new?Thread(t);?//创建线程。
|
|