- 线程一旦死亡就无法在此启动
- 多线程的使用
- 方法1:
- 类t继承Thread类,重写run方法。
- main主线程中调用t.start(),启动线程
- 方法2
- 类t实现Runable接口,重写run方法。
- main主线程中调用new Thread(t).start(),启动线程
- 多线程的原理
- Thread底层实现了Runable接口,采用静态代理的形式对Runable接口功能进行了扩充
- 静态代理
- 格式:目标类和代理类实现了同一个接口
- 目标类:只专注自己的功能
- 代理类:包含目标类属性,代理类方法调用目标类方法,通过方法从上到下依次执行,可以待目标方法前后加入其他功能
- Lambda函数的使用
- 函数的作用:让代码更加简洁,编程更加高效
- 函数的由来:java8加入的新功能。之前使用内部类、静态类、匿名内部类来依次简化代码。现在通过Lambda函数使代码更加简洁。
- 使用条件:接口类必须是函数式接口——只含有一个方法的接口
- 使用方法:T t=(int a)->{Sout("你好Lambda函数")}。说明:T类继承了函数式接口,可以通过Lambda创建实例对象。
- 线程的生明周期
- 创建状态——就绪状态——执行状态——死亡状态,就绪与运行状态中间有一个阻塞状态
- 线程的sleep方法
- 作用:指定线程阻塞的毫秒数,时间到达后立刻计入就绪状态。让线程进入阻塞状态。可以模拟网络延迟、倒计时。
- 每个对象都有一个锁,sleep方法不会释放锁。
- yield礼让方法、join插队并完全执行方法
- 线程的优先级
- 线程t.setPriority(最小1默认5最大10),>10抛异常
- 重点:设置优先级在t.start()之前设置
- 线程同步
- synchronized同步方法或同步代码块,来使线程安全
- 同步方法:synchronized void run(){}在方法的返回值前加synchronized,锁定当前的this类,来使线程安全
- 同步代码块:synchronized(obj){同步的代码},obj是需要锁定的多线程共享的数据属性
- 死锁
- synchronized:抱住资源不放还想要其他被锁住的资源。
- jdk5的lock锁,来使线程安全
- 在线程需要加锁的地方,之前加上lock.lock();最后加上lock.unlock()。表示:当一个线程进入此方法中后上锁,执行完后解锁。
- 使用方法:需要加锁的方法中,创建一个private final ReenTrantLock类的实体类lock,try{lock.lock();接需要锁住的代码}Finally{lock.unlock();}
- 线程协作
- 生产者消费者问题
- 分析对象包括:消费者、生产者、容器
- 生产者对象中有容器属性,和向容器存放数据的方法;消费者对象中有容器属性,和从容器中取出数据的方法。
- 矛盾:容器满了则不能生产,容器没有产品则不能消费,但是消费者和生产者线程都是cpu随机调用执行,可能出现异常(例如容器满了继续生产)
- 解决方案:使用Object类的wait方法和 notifyA ll方法,如果容器 满了,this.wait生产者等待,没满this.notifyAll消费者消费。
- 解析:this表示调用此方法的线程,比如this.wait中this表示生产者,等待。this.notifyAll表示生产者通知消费者(或其他线程),使其他线程解除等待。
多线程复习
原文:https://www.cnblogs.com/youisme/p/14777656.html