线程基础知识
1 核心概念
线程就是独立的执行路径;
在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程;
main()称之为主线程,为系统的入口有,用于执行整个程序;
在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的;
对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;
线程会带来额外的开销,如CPU调度时间,并发控制开销。
每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
2 三种创建方式
Thread class -> 继承 Thread 类
子类集成Thread类具备多线程能力
启动线程:子类对象.start()
不建议使用:避免OOP单继承局限性
Runnable -> 实现Runnable接口
实现接口Runnable具有多线程能力
启动线程:传入目标对象+Thread对象.start()
推荐使用:避免单继承局限性 ,灵活方便,方便同一个对象被多个线程使用 (多个线程同时操作同一个资源的情况下,线程不安全,数据紊乱)
Callable -> 实现Callable接口
实现Callable接口,需要返回值类型
重写call方法,需要抛出异常
创建目标对象
创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
提交执行:Future<Boolean>result1 = ser.submit(t1);
获取结果:boolean r1 = result1.get();
关闭服务:ser.shutdownNow();
3 守护线程
线程分为用户线程和守护线程
虚拟机必须确保用户线程执行完毕,不用等待守护线程执行完毕:如垃圾回收,内存监控等
4 线程同步(并发)
形成条件:队列+锁
同步方法:
public synchronized void method(String[] args){}
缺点:若将一个方法申明为 synchronized 将会影响效率
同步块:synchronized(Obj){}
5 死锁
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。如下图所示:
产生死锁的必要条件:
互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。
5 线程协作
生产者消费者模式

浙公网安备 33010602011771号