6、什么是线程组,为什么在 Java 中不推荐使用?
ThreadGroup 类,可以把线程归属到某一个线程组中,线程组中可以有线程对象, 也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式。 为什么不推荐使用?因为使用有很多的安全隐患吧,没有具体追究,如果需要使 用,推荐使用线程池。
7、为什么使用 Executor 框架?
每次执行任务创建线程 new Thread()比较消耗性能,创建一个线程是比较耗时、 耗资源的。 调用 new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制的创建, 线程之间的相互竞争会导致过多占用系统资源而导致系统瘫痪,还有线程之间的 频繁交替也会消耗很多系统资源。 接使用 new Thread() 启动的线程不利于扩展,比如定时执行、定期执行、定时 定期执行、线程中断等都不便实现。
8、在 Java 中 Executor 和 Executors 的区别?
Executors 工具类的不同方法按照我们的需求创建了不同的线程池,来满足业务 的需求。 Executor 接口对象能执行我们的线程任务。 ExecutorService 接口继承了 Executor 接口并进行了扩展,提供了更多的方法我 们能获得任务执行的状态并且可以获取任务的返回值。 使用 ThreadPoolExecutor 可以创建自定义线程池。Future 表示异步计算的结果,他提供了检查计算是否完成的方法,以等待计算的 完成,并可以使用 get()方法获取计算的结果。
9、如何在 Windows 和 Linux 上查找哪个线程使用的 CPU 时 间最长?
参考: http://daiguahub.com/2016/07/31/ 使用 jstack 找出消耗 CPU 最多的线程代码 /
10、什么是原子操作?在 Java Concurrency API 中有哪些原 子类(atomic classes)?
原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。 处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。 在 Java 中可以通过锁和循环 CAS 的方式来实现原子操作。 CAS 操作—— Compare & Set,或是 Compare & Swap,现在几乎所有的 CPU 指令都支持 CAS 的原子操作。 原子操作是指一个不受其他操作影响的操作任务单元。原子操作是在多线程环境 下避免数据不一致必须的手段。 int++并不是一个原子操作,所以当一个线程读取它的值并加 1 时,另外一个线程 有可能会读到之前的值,这就会引发错误。 为了解决这个问题,必须保证增加操作是原子的,在 JDK1.5 之前我们可以使用同 步技术来做到这一点。到 JDK1.5,java.util.concurrent.atomic 包提供了 int 和 long 类型的原子包装类,它们可以自动的保证对于他们的操作是原子的并且不需 要使用同步。java.util.concurrent 这个包里面提供了一组原子类。其基本的特性就是在多线程 环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当 某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像 自旋锁一样,一直等到该方法执行完成,才由 JVM 从等待队列中选择一个另一个 线程进入,这只是一种逻辑上的理解。 原子类:AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference 原子数组:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray 原子属性更新器:AtomicLongFieldUpdater,AtomicIntegerFieldUpdater, AtomicReferenceFieldUpdater 解决 ABA 问题的原子类:AtomicMarkableReference(通过引入一个 boolean 来反映中间有没有变过),AtomicStampedReference(通过引入一个 int 来累 加来反映中间有没有变过)