共计 4447 个字符,预计需要花费 12 分钟才能阅读完成。
前言
Java 笔记整理上一次已经是三周之前了,在这三周内(除去国庆实际只有两周)又学习了很多的新知识,今天来整理一下笔记,顺带梳理思路
正文
异常
抛出处理(throw,throws):
- throw:用于方法内部,作用是在方法内部抛出一个异常对象且只能跟一个异常对象。
- throws:用于方法声明上,作用是在方法声明上声明抛出异常类型并可以跟多个异常对象。
异常处理:
try{// 可能发生异常的代码}catch(捕获的异常类型 变量名){// 处理异常的代码}finall{// 一定会执行的代码(除 JVM 停止),多用于释放资源}
异常分类:
- 运行时异常:RuntimeException 以及 RuntimeException 的子类都是属于运行时异常。
- 除了运行时异常就是编译异常。
异常分类:
- 运行时异常:RuntimeException 以及 RuntimeException 的子类都是属于运行时异常。
- 除了运行时异常就是编译异常。
Package
- 被访问的包中的类权限必须是 public 的。
- 类中的成员权限:public 或者 protected
- protected 是为其他包中的子类提供的一种权限
包的 4 种权限图解:
javac -d . PackageDemo.java // 编译 d:创建目录 .:在当前目录创建
java cn.java.demo1.PackageDemo // 运行
多线程
创建方式一:继承 Thread 类
- 子类覆盖父类中的 run 方法,将线程运行
的代码存放在 run 中。- 建立子类对象的同时线程也被创建。
- 通过调用 start 方法开启线程。
注意:多次调用 start()会报异常。
创建方式二:实现 Runnable 接口
- 实现类覆盖接口中的 run 方法。
- 通过 Thread 类创建线程,并将实现了
Runnable 接口的子类对象作为参数传递给
Thread 类的构造函数。- Thread 类对象调用 start 方法开启线程。
Thread 和 Runnable 的关系
- Thread 是 Runnable 的子类。
- 实际上 Thread 和 Runable 的关系和代理设计模式很像,这里的 Thread 就是代理类。我们自己所实现的类才是真正的。
Thread 和 Runnable 的区别
- Runnable 可以共享数据
同步:synchronized
synchronized(对象)
{// 需要同步的代码}
同步的前提:
- 同步需要两个或者两个以上的线程。
- 多个线程使用的是同一个锁。
同步的弊端:
- 当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。
常用方法:
- wait():使当前线程进入堵塞状态等待(特点:释放 cpu 执行权,释放锁)。
- notify():唤醒一个标识所属的同步的锁的线程
- notifyAll():唤醒所有标识所属的同步的锁的线程
同步函数
- 在函数上加上 synchronized 修饰符即可。
- 同步函数的锁是 this,而同步代码块的锁可以是任意对象。
- 静态同步函数的锁是本类的字节码对象。
public synchronized void fun(){// 同步的代码}
注意:同步应用过多就有可能会出现死锁,导致线程出现无限期地僵持下去的局面。
锁:Lock
在多线程编程里面一个重要的概念是锁定,如果一个资源是多个线程共享的,为了保证数据的完整性,在进行事务性操作时需要将共享资源锁定,这样可以保证在做事务性操作时只有一个线程能对资源进行操作,从而保证数据的完整性。
- lock.lock():取得锁
- lock.unlock():释放锁
Condition
Condition:监视器,常与 Lock 一起使用,可以让不同的共享线程有不同的监视器,从而实现线程之间的相互配合。
Condition c = lock.newCondition();
- await():造成当前线程在接到信号或被中断之前一直处于等待状态。
- signal():唤醒一个等待线程。
- signalAll():唤醒所有等待线程。
SimpleDateFormat
SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
public class DateDemo {public static void main(String[] args) {Date date = new Date();
SimpleDateFormat simpDate = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 时 mm 分 ss 秒 SSS 毫秒");
String d = simpDate.format(date);
Date p = null;
try {p = simpDate.parse("2016 年 02 月 06 日 05 时 59 分 53 秒 222 毫秒");
} catch (ParseException e1) {e1.printStackTrace();
}
System.out.println(d);
System.out.println(p);
}
}
/*
Run result:2016 年 10 月 13 日 14 时 59 分 07 秒 605 毫秒
Sat Feb 06 05:59:53 CST 2016
*/
Runtime
每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。
public class RunTimeDemo {public static void main(String[] args) throws IOException, InterruptedException {Runtime runt = Runtime.getRuntime(); // 获取 runtime 的 instance
Process p = runt.exec("C:\\Windows\\notepad.exe"); // 启动记事本
Thread.sleep(3000); // 睡眠 3 秒
p.destroy(); // 杀死当前的进程}
}
DecimalFormat
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。
public class DecimalFormatDemo {public static void main(String[] args) {MyDecimalFormat.format("###,###,###$", 10252155.33);
MyDecimalFormat.format("###,###%",25542);// 百分之
MyDecimalFormat.format("###,###\u2030",56200);// 千分之
}
}
class MyDecimalFormat{public static void format(String format,double values){DecimalFormat df = new DecimalFormat(format);
String str = df.format(values);
System.out.println("原数值:["+values+"] 格式化后为:["+str+"]");
}
}
BigInteger
不可变的任意精度的整数。所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
import java.math.BigInteger;
public class BigIntegerDemo {public static void main(String[] args) {BigInteger b1 = new BigInteger("1212114646545646545646546");
BigInteger b2 = new BigInteger("448486164564646546");
BigInteger[] resultArr = b1.divideAndRemainder(b2);
System.out.println("整数部位:"+resultArr[0]+"\n 小数部位:"+resultArr[1]);
System.out.println("加法:"+b1.add(b2));
}
}
clone()
创建并返回此对象的一个副本。
public class Democlone {public static void main(String[] args) {CloneDemo s = new CloneDemo("张三");
CloneDemo d = null;
try {d = (CloneDemo)s.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();
}
d.print();}
}
class CloneDemo implements Cloneable{
private String name;
public CloneDemo(String name) {this.name = name;}
public Object clone() throws CloneNotSupportedException{return super.clone();
}
public void print(){System.out.println("Name 为:"+this.name);
}
}
Timer
一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTaskDemo {public static void main(String[] args) {Timer t = new Timer(); // 建立 Timer 实例
TimerTasks ts = new TimerTasks(); // 建立任务实例
t.schedule(ts, 1000,1000);
}
}
class TimerTasks extends TimerTask{public void run(){SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date nowDate = new Date();
System.out.println(sd.format(nowDate));
}
}