多线程
创建线程的两种方式
延时睡眠
sleep(延时)使线程休眠不会释放锁
线程终止
定义一个标志位flag=false,不推荐使用stop(),destroy()方法
线程强制执行
join,可以想象成插队,等此线程执行完后,再执行其他线程,否则其他线程堵塞
线程通信(不同线程之间的消息传递)
wait(),notify()两个方法在一起使用
wait() 使线程处于等待状态(可加参数,设置等待豪秒数),会释放锁,
notyfy唤醒一个等待的线程,notifyall唤醒同一个对象上所有调用wait()方法的线
线程礼让
yield(),现有a,b两个线程,a先进入cpu执行,a调用yield(a从cpu中出来),使线程a处于就绪状态,然后cpu再随机调度其中一个线程
线程安全
加锁的两种方式:
synchronizey(隐式锁),lock(显示锁)
区别:
synchronizey可以作用在方法和代码块(参数)上,lock lock只能作用在代码块 lock.lock加锁 lock.unlock释放锁
死锁
某一同步块拥有两个以上对象的锁时,可能发生死锁
处理方法:
避免两条线程同时拥有一个锁
线程池
lamda表达式
对于函数式接口我们就可以使用lamda表达式创建该接口对象
lamda表达式简化过程
package com.yang;
public class TestLamda {
//3.静态内部类
static class Love2 implements Ilove{
public void lamda() {
System.out.println("i like lamda2");
}
}
public static void main(String[] args) {
Ilove love = new Love();
love.lamda();
love = new Love2();
love.lamda();
//4.局部内部类
class Love3 implements Ilove{
public void lamda() {
System.out.println("i like lamda3");
}
}
love = new Love3();
love.lamda();
//5.匿名内部类,没有类名,必须借助接口实现
love = new Love(){
public void lamda() {
System.out.println("i like lamda4");
}
};
love.lamda();
//6.lamda,jdk1.8新特性
love=()->{
System.out.println("i like lamda5");
};
love.lamda();
}
}
//定义一个函数试接口
interface Ilove{
void lamda();
}
//实现类
class Love implements Ilove{
public void lamda() {
System.out.println("i like lamda");
}
}