java偏功能实现的面试题,教你如何做面霸( 十 )


九.多线程 如何理解多线程(>5)
如果不使用多线程 只有一件事干完才能干另一件事 那么你在听歌时候只有听歌的线程在执行 就不能评论 , 而是用多线程后可以在听歌时候同时评论 同时提高对内存的使用率 避免内存空闲(但是不能创建太多线程 , 速度会变慢)
描述一下线程状态 (>8)
使用 new 关键字和 Thread 类或其子类建立一个线程对象后 , 该线程对象就处于新建状态 。它保持这个状态直到程序start() 这个线程 。就绪状态:当线程对象调用了start()方法之后 , 该线程就进入就绪状态 。就绪状态的线程处于就绪队列中 , 要等待JVM里线程调度器的调度 。运行状态:如果就绪状态的线程获取 CPU 资源 , 就可以执行 run() , 此时线程便处于运行状态 。处于运行状态的线程最为复杂 , 它可以变为阻塞状态、就绪状态和死亡状态 。阻塞状态:如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法 , 失去所占用资源之后 , 该线程就从运行状态进入阻塞状态 。在睡眠时间已到或获得设备资源后可以重新进入就绪状态 。可以分为三种:等待阻塞:运行状态中的线程执行 wait() 方法 , 使线程进入到等待阻塞状态 。同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用) 。其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时 , 线程就会进入到阻塞状态 。当sleep() 状态超时 , join() 等待线程终止或超时 , 或者 I/O 处理完毕 , 线程重新转入就绪状态 。(注意,sleep是不会释放持有的锁)死亡状态:一个运行状态的线程完成任务或者其他终止条件发生时 , 该线程就切换到终止状态 。
介绍一下线程池(>8)
Java中开辟出了一种管理线程的概念 , 这个概念叫做线程池 , 有以下优点(1)降低资源消耗 。通过重复利用已创建的线程降低线程创建和销毁造成的消耗 。(2)提高响应速度 。当任务到达时 , 任务可以不需要等到线程创建就能立即执行 。(3)提高线程的可管理性 。线程是稀缺资源 , 如果无限制的创建 , 不仅会消耗系统资源 , 还会降低系统的稳定性 , 使用线程池可以进行统一的分配 , 调优和监控 。
什么是线程安全  , 介绍几个java中线程不安全的类或方法 (>8)
多次执行线程 , 结果不变 , 那么线程安全StringBuilder , simpledateformat等
的四个线程池为什么不建议使用 (>9)
造成oom , 详细解释清自行百度 。
介绍一下 、 (>10)
volatile:保证了不同线程对这个变量进行操作时的可见性 , 即一个线程修改了某个变量的值 , 这新值对其他线程来说是立即可见的 。(实现可见性)只能保证对单次读/写的原子性 。i++ 这种操作不能保证原子性 。ThreadLocal:一个线程的局部变量(其实就是一个Map),ThreadLocal会为每个使用该变量的线程提供独立的变量副本 , 所以每一个线程都可以独立地改变自己的副本 , 将对象的可见范围限制在同一个线程内 , 而不会影响其它线程所对应的副本 。这样做其实就是以空间换时间的方式(与synchronized相反) , 以耗费内存为代价 , 单大大减少了线程同步(如synchronized)所带来性能消耗以及减少了线程并发控制的复杂度 。