线程
执行的分支(索引)
(串行、并行、并发、进程、线程)
- 如何创建线程?
- 继承Thread
- 实现Runnable接口
多线程的使用场景
多个线程分解庞大的分解,,比如:
- 下载文件(多个线程一起下载,下载的更快。因为单个线程获得cpu的运行概率不大)
- 抢票(创建多个线程一起抢,概率大)
但是要注意不是线程越多越好,内存消耗大
进程和线程区别?
- 每个进程都有独立的内存空间
- 一个进程至少要有一个线程
- 每创建一个线程都有自己的栈、本地方法区、程序计数器
run():指定线程的任务
Thread.currentThread().getName():获取当前线程的名字
继承方式VS实现接口
- 继承方式资源不共享,实现接口方式共享
- 继承方式无线程安全问题,实现接口方式有线程安全问题
线程不安全的含义?
多线程修改同一份资源带来的数据错乱
处理方案?
- 同步
- 同步方法
- 同步代码块
监(jiān)视(shì)对(duì)象(xiànɡ)一般是this或者字节码对象
- 加锁
线程安全
多线程修改同一份资源不会数据错乱
单例模式
- 饿汉式(无论如何先创建实例)
- 懒汉式(需要的时候再创建实例,但是线程不安全)
- 方法一(同步方法)
- 方法二(同步代码块)
- 方法二的优化
如果已经有实例了,就直接返回,不需要让其他线程继续等浪费时间
线程的常用方法
- join
- getName
- setName
- setPriority
等到知道Thread的任务完成后才继续向下执行[插队]
join(long mills):插到main线程中停留多久
setPriority()并不是说一定会,而是增加了概率而已
two进不来,因为没让资源释放,没把锁打开。当one执行完,two进来了,但是此时的count为0
Thead.sleep():让当前线程休眠,但是不会释放资源,不开锁
thread.wait():线程一直休眠,除非调用调用notify()唤醒
thread.wait(long timeout):休眠多少时间,当到底时间该线程会自动醒来
Sleep()和wait()的区别?
- Sleep()是线程的方法,wait()是Object的方法
- Sleep()不会释放资源,不释放锁。Wait()会
- Wait()可以无限等待(用notify/notifyAll唤醒)。。。
- 两者都是让线程休眠
notify/notifyAll()随机唤醒线程