线程基础知识

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 线程协作

   生产者消费者模式

 

posted @ 2021-09-16 09:38  小牛哞哞哞  阅读(52)  评论(0)    收藏  举报