多线程相关知识总结

1.并发编程三要素

   (1)原子性

          原子性指的是一个或者多个操作,要么全部执行,要么全不执行 

   (2)可见性

           可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改时,其他线程变量可以立即看到修改的结果。

   (3)有序性

          即程序的执行顺序按照代码的先后顺序执行

2.Runnable和Callable的区别

   (1) Callable规定重写的方法四call,Runnable规定重写的方法是run方法

   (2)Callable的任务执行后可以返回值,而Runnable的任务是不能返回值额

   (3)Call方法可以抛出异常,而run方法不可以抛出异常

扫描二维码关注公众号,回复: 7392292 查看本文章

   (4)运行Callable方法可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待结果的计算,通过Future对象可以了解任务的执行情况,可以取消任务的执行,还可以获取执行的结果。

3.继承Thread类和实现Runnable接口实现线程的区别

   (1)使用Thread类创建多线程

            优势是

                   编写简单,如果访问当前线程,则无需使用Thread.currentThread方法,直接使用this即可获得当前线程

           劣势是:无法继承其他的类

   (2)实现Runnable接口(Callable)

            优势是:可以继承其他的类,多线程共享一个Target对象,所以非常适合多个相同的线程来处理同一个资源的情况,可以将cpu,代码和数据                             分开,较好的体现了面向对象的思想

            劣势是:编程稍微复杂,如果访问当前线程,则必须使用Thread.currentThread()方法

4.多线程中阻塞状态分为哪几种情况

       (1)等待阻塞 

      wait()

       (2)同步阻塞

                占用锁失败

  (3)其他阻塞

               sleep(),   join()

5.什么是线程池?线程池的创建方式?

   线程池:提前创建若干个线程来处理任务,当线程处理完,线程会等待下一任,任务在执行时,其他线程会等待

   适用场景:频繁的创建和销毁线程

   线程池的创建

       (1)  newCacheThreadPool()  --------------->可缓存线程池

          (2)newFixedThreadPool       ------------------>定长线程池,可控制线程最大并发数

          (3)newScheduleThreadPool ------------------>定长线程池,支持定时及周期性的任务调度

          (4)  newSingleThreadPool  ------------------>单线程化线程池,用唯一的工作线程来执行任务

  线程池优点:

          (1)减少对象的创建和销毁

     (2)控制最大的并发数,提高形同资源的使用率,避免过多线程造成资源竞争,形成阻塞

          (3)提供定时执行,定期自行、单线程,并发控制

6.ReadWriteLock

   ReentrantLock 在某些时候有局限性,使用ReenttrantLock是为了防止数据读写时造成不一致,不同的线程在读写数据时没有必要加锁。ReadWriteLock是一个读写锁接口,ReentrantLock是ReadWriteLock的具体实现,使用ReadWriteLock实现了读写分离,读锁是共享的,写锁是独占式的,提升了读写的性能。

7.FutureTask

   FutureTask表示一个异步运算的任务。FutureTask里面可以传入一个Callable的具体实现类,可以对这个异步运算的结果进行等待获取、判断是否已经完成、取消任务等操作。FutureTask也是Runnable接口的实现类,所以FutureTask 也可以放到线程池中。

  8.synchronized和ReentrantLock的区别

      synchronized是关键字,而ReentrantLock是类,它可以对获取锁的时间进行设置,获取各种锁的信息以及灵活的实现多路通知,相比于synchronized,ReentrantLock有更好的扩展性。

9.线程类的构造方法、静态块是被哪个线程调用的

   new 这个线程类的线程调用

10.提交任务时,线程池队列已经满在,这时会发生什么?

    无界队列:LinkedBlockingQueue      无限存放,等待执行

    有界队列:ArrayBlockingQueue       首先根据MaxMunPoolSize 的值增加线程数量,如果还是处理不过                       来,则会使用拒绝策略。

11.死锁的四个条件

    1、互斥条件:一个资源每次只能被一个进程使用;

  2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;

  3、不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺;

  4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系;

。。。。。

猜你喜欢

转载自www.cnblogs.com/pamne/p/11609856.html