多线程
多线程的创建
-
Tread类
-
Runnable接口
-
Callable接口
Tread类
(不建议使用,避免OOP单继承的局限性)
步骤:
-
自定义线程类继承Thread类
-
重新run()方法,编写线程执行体
-
创建线程对象Thread,调用start()方法启动线程
Runnable接口
步骤:
-
实现runnable接口
-
重新run()方法,编写线程执行体
-
创建实体对象和线程对象Thread
-
实现对象丢入Thread,调用start()方法启动线程
多线程中拿名字的代码:
Thread.currentThread().getName()
静态代理模式
-
代理对象和真实对象都要实现同一接口
-
代理对象要代理真实角色
Lamda表达式
作用:
-
避免内部类定义过多
-
代码看起来更简洁
-
去掉没有意义的代码,只留下核心逻辑
函数式接口
一个接口只包含一个抽象方法,就是函数式接口
线程状态
- 创建
- 就绪
- 阻塞
- 运行
- 死亡
线程停止
-
不推荐使用stop()、destroy()等JDK废弃的方法
-
推荐让线程自己停下来,使用一个标志进行终止变量,flag = false
线程休眠
-
每个对象都有一把锁,sleep不会释放锁
-
sleep可以模拟网络延时(放大问题的发生性),倒计时等
-
sleep指定当前线程阻塞的毫秒数,到时间后线程进入就绪状态
-
sleep存在异常InteredException
线程礼让yield
-
让进去的线程转为就绪状态,两个线程重新竞争
-
礼让不一定成功
合并线程join
-
本质是增大份额比例,以此来增高先执行的概率
-
main线程优先级最高
-
MAX_PRIORITY=10,最低为1,默认为5
-
先设置优先级,再启动
守护(daemon)线程
-
线程分为用户线程和守护线程,默认是用户线程
-
用户线程执行完毕,程序就结束,不管守护线程是否结束
-
形成条件:队列+锁
同步方法 synchronized
-
一个对象一个锁
-
当一个线程获得对象的锁时,独占资源,其他线程必须等待
-
安全,但会降低效率
-
锁方法本身
同步块:Obj同步监视器
-
任何对象都能锁
死锁
两个或多个线程都在等待对方释放资源,都停止执行
lock锁
显式加锁和解锁:
ticket.lock();
ticket.unlock();