Java面试肯定会考核java重要知识点,多线程就是java面试中必问的问题,所以如果我们能够掌握好java多线程的知识,也能为顺利通过面试做出贡献,那java多线程面试重点有哪些?下面来我们就来给大家讲解一下。
1.开启线程的方式有哪些?
继承 java.lang.Thread 类,重写run()方法
实现 java.lang.Runnable 接口,重写run()方法,使用时还要new一个Thread类的实例,把Runnable实例作为参数
实现 java.util.concurrent.Callable 接口,重写call()方法,会抛出异常,有返回值;必须指定泛型,返回值就是泛型
从线程池中获取(注:Thread线程对象不能使用线程池)
2.调用run()方法和start()方法的区别是什么?
直接调用run()方法相当于调用了一个普通方法,没有开启新线程,是同步的;而start()才是开启了一个新线程。
3.11. notify()和 notifyAll()有什么区别?
notifyAll()会唤醒所有的线程,notify()之后唤醒一个线程。notifyAll() 调用后,会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行,如果不成功则留在锁池等待锁被释放后再次参与竞争。而 notify()只会唤醒一个线程,具体唤醒哪一个线程由虚拟机控制。
4.创建线程池有哪几种方式?
(1) newFixedThreadPool(int nThreads)
创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程规模将不再变化,当线程发生未预期的错误而结束时,线程池会补充一个新的线程。
(2) newCachedThreadPool()
创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制。
(3)newSingleThreadExecutor()
这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行。
(4) newScheduledThreadPool(int corePoolSize)
创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。
5.在 java 程序中怎么保证多线程的运行安全?
线程安全在三个方面体现:
原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);
可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);
有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。
6.ThreadLocal 是什么?有哪些使用场景?
线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。
Java多线程所有的知识点都是重点,作为java人员需要了解多线程的含义以及其使用方法,能够在多个场景中使用才行!最后大家如果想要了解更多Java面试题知识,敬请关注奇Q工具网。
推荐阅读: