接受过去、珍惜当下、展望未来。
今天整理记录的内容:
1.异常
2.包
3.java中四种权限
4.打包jar包和解压jar包命令
5.多线程中join(long mills)
6.多线程死锁问题
7.线程间通信
8.线程安全
9.volatile关键字
一、异常
1.异常处理方式:try{}catch{}、throws。
2.finally不被执行:在执行finally代码块前调用 system.exit(0)。此时finally代码块不被执行。
解释:
如果某段代码有发生异常的可能,就要在此处加上try{}catch(Exception e){},用于捕捉异常并处理异常;还可以在方法上通过throws声明该异常.
我们可能认为在finally块中的代码肯定执行或者遇到return就不会执行,其实不然,要想finally块中的代码不被执行,只有在执行finally块代码前加上System.exit(0);
private static void testException() throws FileNotFoundException{//可以在方法上声明该异常
/*也可以用try{}catch(){}来捕捉异常*/
try {
FileInputStream fis = new FileInputStream("test.txt");//因为这里要访问文件,那就存在潜在问题,要访问的文件到底存在不存在呢?
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
以上两种方式二选一。
private static void testException(int number) {
try {
int x = 10 / number;//这里会发生潜在异常,除以0.我们在这里采用捕捉的方式处理。
return;//一些人会认为在这里返回,我们看输出结果
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
System.out.println("执行finally");
}
}
输出结果:
执行finally
证明return不会阻碍finally块的执行。
二,包
规定:某类在指定包中中,则计算机中必须有该包级目录。例如com.hbbfxy.test test 类在com.hbbfy包中,所以计算机中必须有com/hbbfxy 这个目录且test.class必须放到这个目录下。当我们利用命令行运行test.class时,要在com这个目录的父目录下运行test.class(这时必须是完整类名)
解释:
例如我们有一个指定包(com.hbbfxy)的test类在E:\Java\OneJava\src\com\hbbfxy下,我们用命令行编译test.java得到test.class,当我们运行test.class时要做到如下所示
//不然会出现如下错误提示
三、java中四种权限:
1、private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类(内部)、属性以及方法只能在自己的类中使用。
2、default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,允许在同一个包中进行访问。
3、3、protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类(内部)、属性和方法能在同一包中或不同包中的子类(注意这里说的不是子类对象)访问。
4、public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。
注意:
顶层类只能被default、public权限修饰符修饰;在Java中默认修饰符四default。
四、打包jar包和解压jar包命令
1.jar -cf 打成的jar包名称.jar 待打成Jar包的文件夹名称1 待打成Jar包的文件夹名称2……… (不查看打包过程)
2.jar -cvf 打成的jar包名称.jar 待打成Jar包的文件夹1 待打成Jar包的文件夹名称2……… (查看打包过程)
3.解压Jar包命令:jar -xvf jar包名称
解释:
这里所说的打成Jar包是把class文件所在的目录打成Jar包供其它项目使用。
例如我有一个项目OneJava,编译后得到的.class文件在E:\Java\OneJava\bin\com\hbbfxy 从目录结构来看,我的项目包名是com.hbbfxy 所以我要打Jar包的话 命令行中输入的命令是
由上图我们可以看到,我们要将com这个文件夹打包成名字为MyJar的Jar包;在打包的过程中会将.class文件压缩,使整个文件所用的内存变小,这也是为什么将.class文件打成Jar包供其他项目使用的原因。
五、多线程中join(long mills):
有a和b两个线程,如果在a线程中调用b.join(1000),那么a线程就会给b线程1秒的时间去执行自己的任务,此时a线程处于挂起状态,如果在1秒内没有执行完任务或在1秒内完成任务,则a线程由挂起状态转为争夺状态。 如果调用的是b.join(),则a线程一直等到b线程完成任务才开始转为争夺状态。
六、多线程死锁问题
所谓多线程死锁问题我的理解是:互相持有对方要使用的锁对象
解释:
线程一:
synchronized(锁一){
......
线程一运行到这里:线程一持有线程二将要用的 锁一
synchronized(锁二){
......
}
}
线程二:
synchronized(锁二){
......
线程二运行到这里:线程二持有线程一将要用的 锁二
synchronized(锁一){
......
`
}
}
线程一和线程二互相持有对方将要使用到的锁对象。
七、线程间通信
线程间通信:wait()、notify()、notifyAll() 要与监视器 synchronized共同使用。因为线程间通信是指在相同的监视器(持有的锁是完全一样的)的情况下进行通信。调用wait()方法会释放锁并放弃执行权,执行notify()后并不会马上将锁给wait(),而是等notify()所在synchronized中的代码执行完并释放锁后才将锁给wait(),并且执行notify()后是唤醒多个wait()中任意一个。
八、线程安全
线程安全性包括两个方面,①可见性。②原子性。 (关于可见性和原子性的讲解查看下方volatile关键字的学习链接。)
九、volatile关键字
对于volatile关键字的讲解本人看的JAVA多线程之volatile 与 synchronized 的比较
学习心得:欲速则不达!