• java多线程的一些面试题


    8.callable与fature
      Callable与Runnable类似,但是Callable有返回值,并且有一个参数化的类型。
      Fature保存异步计算的结果。
    9.执行器
      Executor.
    10.同步器
      ...
    11.多线程生产者消息者问题
      使用await与notify或者notifyAll解决。
    12.死锁问题
      使用notifyAll或者wait(long mills)计时等待解决。
    13.解决同步问题的方法总结
      A、synchronized关键字加锁;

      B、ReentrantLock加锁;

      C、使用现有的同步队列、类等;

      D、使用volatile关键字。
    14.你使用过java.util.concurrent包下的哪些类?
      A、java.util.concurrent.ExecutionException;
      B、java.util.concurrent.Future;
      C、java.util.concurrent.Callable
      D、java.util.concurrent.SynchronousQueue
      E、java.util.concurrent.ThreadFactory;
      F、java.util.concurrent.ThreadPoolExecutor;
      G、java.util.concurrent.TimeUnit;
      H、java.util.concurrent.atomic.AtomicInteger;
      I、concurrentHashMap;
      J、countDownLatch;
      K、信息量:Semaphore;
      L、阻塞队列:BlockingQueue及其实现类;
      ...再加上资源池相应的包org.apache.commons.pool2下的包。
    15.同一帐户,多个用户同时存,同时取,如何处理并发线程安全问题?
      使用锁,应用程序锁,数据库锁,设置spring事务的隔离级别;

    16.sleep、wait、notify、notifyAll的区别?
      16.1 sleep 和wait:
        16.1.1. sleep是Thread类的静态方法,wait是Object类中定义的方法
        16.1.2. Thread.sleep不会导致锁行为的改变,如果当前线程是拥有锁的,那么Thread.sleep不会让线程释放锁,而wait 会释放当前线程锁
        16.1.3. Thread.sleep需要设定休眠时间.Object.wait也可以设定wait时间,或者通过线程执行notify/notifyAll进行唤醒
      16.2 notify和notifyAll:
        16.2.1. notify唤醒一个线程,如果有多线程在wait,可能是随机一个
        16.2.2. notifyAll唤醒所有在等待的线程,
        16.2.3. 使用中尽量使用notifyAll,因为notify容易导致线程死锁(nofity只唤醒一个,其他等待的线程没有唤醒)
    17.join、yield、wait和sleep
      参考:https://blog.csdn.net/Crazypokerk_/article/details/87171229
      17.1 yield: 只是使当前线程重新回到可执行状态,所以执行yield()线程有可能在进入到可执行状态后马上又被执行.
      17.2 join: join()就是让其他线程变为等待(结合例子:知道j1执行完后,才释放).
      17.3 wait: 是当前线程处于等待状态,会释放当前的锁资源,使用wait()的时候要处理.
      17.4 sleep: 使当前的正在执行线程处于停滞状态,sleep()使线程进入堵塞状态,同时不会释放所资源.
    18.实际应用中如何处理多线程生产者消费者问题?
      在现实中你解决的许多线程问题都属于生产者消费者模型,就是一个线程生产任务供其它线程进行消费,你必须知道怎么进行线程间通信来解决这个问题。
      18.1 比较低级的办法是用wait和notify来解决这个问题;
      18.2 比较赞的办法是用Semaphore 或者 BlockingQueue来实现生产者消费者模型;
    19.如何避免死锁?
      19.1 Java多线程中的死锁,死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
      19.2 这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:
      19.2.1 互斥条件:一个资源每次只能被一个进程使用。
      19.2.2 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
      19.2.3 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
      19.2.4 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
    19.3 如何避免死锁
      避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。  
      具体方法如下:

    20、java并发包都有哪些线程池类?
      Executors已提供工厂方法创建的包括如下4个线程池,以及可以通过ThreadPoolExecutor创建自己定制的线程池。
        • newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
        • newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
        • newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
        • newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
        • newSingleThreadScheduledExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。

  • 相关阅读:
    xpath 笔记
    实验四 决策树算法及应用
    实验三 朴素贝叶斯算法及应用
    机器学习 实验二 K-近邻算法及应用
    实验一 感知器及其应用
    JAVA学习路线
    实验三 面向对象分析与设计
    实验二 结构化分析与设计
    实验1:软件开发文档与工具的安装与使用
    ATM管理系统
  • 原文地址:https://www.cnblogs.com/wjqhuaxia/p/11747907.html
Copyright © 2020-2023  润新知