1、Thread/runnable
1)继承Thread类
2)实现Runnable接口
2、两种启动线程方法的区别
1)共同点
必须调用Thread产生线程,调用start开启线程
2)不同点
继承Thread类是单继承,用接口比继承更灵活;继承Thread每继承一次必须产生相应Thread,而Runnable只用产生一个实例。
3、start方法和run方法的区别
start:开启线程,处于就绪状态
run:线程体,包含线程执行内容
4、线程间通信
1)synchronized关键字
a. volatile
volatile是变量修饰符,其修饰的变量具有可见性。可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值。volatile禁止指令重排
b. synchronized
synchronized可作用于一段代码或方法,既可以保证可见性,又能够保证原子性。可见性体现在:通过synchronized或者Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存中。原子性表现在:要么不执行,要么执行到底。
总结(1)从而我们可以看出volatile虽然具有可见性但是并不能保证原子性。
(2)性能方面,synchronized关键字是防止多个线程同时执行一段代码,就会影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized。
但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。
https://blog.csdn.net/seu_calvin/article/details/52370068
2)sleep / wait
sleep()不释放同步锁,wait()释放同步锁。
用法上的不同是sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interrupt()来强行打断;wait()可以用notify()直接唤起。
sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行;wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者
5、线程池
1)好处
a. 降低资源消耗
b. 提高响应速度
c. 提高线程的可管理性
2)ThreadPoolexecutor
工作流程:
首先线程池判断基本线程池是否已满;其次线程池判断工作队列是否已满;最后线程池判断整个线程池是否已满。
网友评论