文章目录
1.多线程基础
⑴什么是多线程
运行中的exe程序就是一个进程,进程中独立的子任务就是线程
⑵线程和进程的区别
进程是系统进行资源分配的一个独立单位,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,一个进程可以包括多个线程
⑶线程的五大状态
- 新建 创建线程还没有start
- 就绪 start但是还没有获取CPU时间片
- 运行 正在执行
- 阻塞 比如sleep等等状态
- 死亡 正常退出或者让发生异常
2.线程的启动
⑴继承Thread类
⑵实现Runnable接口
⑶实现Callable接口
- Callable规定的方法是call(),Runnable规定的方法是run()
- Callable的任务执行后可返回值,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取‘将来’结果;当不调用此方法时,主线程不会阻塞。而Runnable的任务是不能获取返回值
- call方法可以抛出异常,run方法不可以
3.停止线程
一般有三种方式可以停止线程:
- ①使用stop方法强行终止线程(不推荐)
- ②使用退出标志(推荐)
- ③使用interrupt方法中断线程,但是记住一个很重要的点:interrupt()并不能真正的中断线程,需要配合其它方式
4.sleep
- 必须捕获异常。
- 线程睡眠到期自动苏醒,并返回到可运行状态,不是运行状态
- sleep方法没有释放锁
5.wait/notify/notifyAll
三者都需要在同步方法或者同步代码块调用。否则抛java.lang.IllegalMonitorStateException运行异常
- wait 进入wait()方法后,当前线程释放锁
- notify 唤醒一个正在等待该对象的线程,然后竞争获取锁
- notifyAll 唤醒所有正在等待该对象的线程,然后竞争获取锁
6.yeild
使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的。
7.join
Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。join里面可以传等待时间,0的话等待执行完毕。
8.线程优先级
优先级高的线程获得的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务。
- ①线程优先级用thread.setPriority(int a)( 1<=a<=10)方法来进行赋值
- ②线程优先级有继承性,如果主线程启动threadA线程且threadA线程没有另外赋予优先级,则threadA线程优先级和main线程一样(即通过A线程启动线程B,线程B没有设置优先级则优先级同A一致)。线程默认优先级为5.
- ③CPU尽量将执行资源让给线程优先级高的,即线程优先级高的总是会大部分先执行,但是不代表高优先级的线程全部都先执行完再执行低优先级的线程
- ④在调用start方法前面设置
9.内存可见性
⑴ JMM
一个线程对共享变量值的修改能够及时被其它线程看到,我们把这个共享变量叫做可见的。