学习内容:4.17 P320-P351
解决线程安全问题
- 同步代码块 :当多个线程一起抢占CPU时,先抢到的会获取锁对象obj,然后进入代码块,剩余线程需要等第一个线程运行结束归还锁,才能继续获取obj锁对象,在进入代码块
private int ticket = 100;
Object obj = new Object();
@Override
public void run() {
synchronized (obj){
while (tichet>0){
System.out.println(Thread.currentThread().getName()+"第"+tichet+"票");
tichet--;
}
}
- 同步方法:此处的锁对象是this也就是new RunnableImpl
@Override
public void run() {payTicket();}
public synchronized void payTicket(){
while (tichet>0){
System.out.println(Thread.currentThread().getName()+"第"+tichet+"票");
tichet--;
}
}
- 静态同步方法:也可以实现,此处的锁对象是类名.class对象
public static synchronized void payTicket() {
//代码块
}
- Lock:先创建一个Lock的子类ReentrantLcck();对象,然后调用lock()开启锁,再多线程安全问题代码后释放锁unlock(),一般写在try,catch,finally中
线程间通信
- 线程间通信 :多个线程需要处理同一资源,但处理的任务却不相同
- 等待唤醒机制 :
- wait进入等待阶段,可以传入毫秒数,等号秒结束自动唤醒
- notify 可以唤醒wait阶段的进程
- notifyAll 唤醒全部的wait进程
- 线程的状态
线程池
//创建一个线程池,里面有3个线程
ExecutorService es = Executors.newFixedThreadPool(3);
//执行
es.submit(new RunnableImpl2());
es.submit(new RunnableImpl2());
es.submit(new RunnableImpl2());
//销毁线程池
es.shutdown();
Lambda表达式
//常规书写调用
incokeCalc(10, 20,
new Calculator() {
@Override
public int clac(int a, int b) {
return a + b;
}
}
);
//lambda简化
incokeCalc(10,21,(int a,int b)->{
return a+b;
});
//lambda再次简化
incokeCalc(10,20,(a,b)-> a+b);
- 括号中参数列表类型可以省略
- 括号中参数只有一个,也可以省略
- 如果{}中只有一行,无论是否有return ,都可以省略{} return 分号,省略要一起省略
File类
- java中用于对文件或文件夹操作的类
- File.pathSeparator 路径分隔符windows:分号 linux:冒号
- File.separator 文件名称分隔符 windows:反斜杠\ linux:正斜杠/
- 绝对路径:电脑中起始文件夹 C:…
- 相对路径:相对于项目根目录 a.txt
构造方法
- File(String pathname)输入字符串路径,返回File类型的对象
- File(String parent,String child)参数1为字符串路径,参数2为文件/文件夹
- File(File parent,String child)参数1为File类型,可以使用File的基本方法,参数2为文件/文件夹
常用方法
- getAbsolutePath() 返回File对象的绝对路径
- getPath() 返回File对象构造方法的路径
- getName() 返回File对象的文件/目录名称
- length() 返回File对象的文件长度 (文件夹是没有大小概念的,路径为假/为文件夹返回0)
- exists() 判断File对象表示的文件/文件夹是否存在
- isDirectory() 判断是否为文件夹
- isFile() 判断是否为文件
- createNewFile() 当前文件夹不存在,则创建一个文件夹
- delete()删除此文件/目录
- mkdir()创建File表示的目录
- mkdirs()创建多级目录
- list()返回为字符串数组 ,里面是所有File中的子文件或目录
- listFiles()返回一个File数组,里面是所有File中的子文件或目录