我把所有Java相关的面试题和答案都整理成了PDF,并收藏了目录,非常方便阅读面试题和答案PDF下载:https://www.hicxy.com/2645.html面试题及答案PDF下载:https://www.hicxy.com/2645.html面试题及答案PDF下载:https://www.hicxy.com/2645.html1.更多线程与单线程的区别与联系?1、在单核CPU中,CPU被划分成小的时间片,每一时刻只有一个线程在执行,这是一种轮流占用CPU的微观机制。2、多线程中会有线程上下文切换,会减慢程序的执行速度,即有两个线程执行一个进程所需的时间比有一个进程执行两次需要的时间要长一个线程。结论:使用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间。2.什么是多线程中的上下文切换?多线程会在一组计算机上共享CPU,当线程数大于分配给程序的CPU数时,为了让每个线程都有机会执行,就需要把CPU用在转动。不同线程的切换利用了CPU等产生的切换数据,这就是上下文切换。3、join方法的作用是什么?Thread类中join方法的主要作用是同步,可以让线程间的并行执行变成串行执行。当我们调用一个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程执行完毕,调用线程才会继续执行。4、创建线程池参数有什么作用?publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueworkQueue,ThreadFactorythreadFactory,RejectedExecutionHandlerhandler)1.corePoolSize:核心线程池大小,当提交任务时,线程池会创建线程执行即使其他空闲的核心线程能够执行新的任务,任务也会被创建,直到需要执行的任务数大于线程核心大小时才会继续创建。2.maximumPoolSize:线程池的最大数量,允许创建的最大线程数,如果队列已满且创建的线程数小于最大线程数,则会创建一个新的线程来执行任务。如果是无界队列,这个参数基本没用。3.keepAliveTime:线程保活时间,线程池工作线程空闲后的保活时间,所以如果任务比较多,每个任务执行时间较短,可以增加这个时间来提高线程利用率。4.unit:线程保持活跃的时间单位,天(DAYS),小时(HOURS),分钟(MINUTES,毫秒MILLISECONDS),微秒(MICROSECONDS),纳秒(NANOSECONDS)5.workQueue:任务队列,保存等待执行A阻塞任务队列。一般来说,可以选择以下阻塞队列:ArrayBlockingQueue:基于数组的有界阻塞队列。LinkedBlockingQueue:基于链表的阻塞队列。SynchronizedQueue:不存储元素的阻塞队列。PriorityBlockingQueue:优先级阻塞队列。6.threadFactory:设置创建线程的工厂,可以通过线程工厂为每一个创建的线程设置一个更有意义的名字。7.handler:饱和策略也叫拒绝策略。当队列和线程池都满了,就饱和了。因此需要采用策略来处理新任务。默认策略是AbortPolicy。AbortPolicy:直接抛出异常。CallerRunsPolicy:调用者所在线程运行任务。DiscardOldestPolicy:丢弃队列中最新的任务,执行当前任务。DiscardPolicy:不处理,直接丢弃。当然你可以根据自己的应用场景实现RejectedExecutionHandler接口自定义策略。5.给出同步和异步的例子。如果系统中存在临界资源(资源数量小于竞争资源的线程数量),例如正在写入的数据可能稍后被另一个线程读取,或者正在读取的数据可能已被写入另一个线程,则必须同步访问这些数据(数据库操作中的排他锁就是最好的例子)。当应用程序调用对象上的方法执行时间很长并且不希望程序等待方法返回时,应该使用异步编程。在许多情况下,使用异步方法通常效率更高。其实,所谓同步是指阻塞操作,而异步是指非阻塞操作。对于以下问题,您可以先自己思考一下。另外我整理了所有Java相关的面试题和答案,给大家参考面试题和答案PDF下载:https://www.hicxy.com/2645.html面试题和答案PDF下载:https://www.hicxy.com/2645.html面试题及答案PDF下载:https://www.hicxy.com/2645.html6。如何创建线程池7.为什么wait()方法和notify()/notifyAll()方法要在同步块中调用8.为什么wait和notify方法要在同步块中调用?9、join方法的实现原理10、notify()和notifyAll()有什么区别?11、为什么wait、notify、notifyAll方法不在thread类中?12.#2.同步静态方法13.当一个线程进入一个对象的同步实例方法时,其他线程是否可以进入这个对象的其他方法?14.你对线程优先级的理解是什么?15、关闭线程池16、实现线程同步和互斥有几种方法。它们都是什么?17.什么是守护线程?这有什么意义呢?18.什么是同步锁?19.Java中的CycliBarriar和CountdownLatch有什么区别?20.wait和sleep方法有什么区别?21.为什么Thread类的sleep()和yield()方法是静态的?22、Java中使用的线程调度算法是什么?23.现在有三个线程T1、T2、T3。如何保证T1执行完后T2执行,T2执行完后T3执行?24、Java中的Executor、ExecutorService、Executors有什么区别?25、对乐观锁和悲观锁的理解是什么,如何实现?26.如何停止正在运行的线程27.什么是ThreadLocal28.什么是Java内存模型29.什么是不可变对象以及它如何帮助编写并发应用程序?30.什么是原子操作?Java并发API中的原子类是什么?31.什么是ConcurrentHashMap的并发?32.谈谈你过得怎么样使用synchronized关键字,你在项目中用过吗?synchronized关键字的三种主要使用方式:33.Java中的Semaphore是什么?34.如何在两个线程之间共享数据?35.什么是ThreadLocal变量?36.如何检查线程是否拥有锁?37.Java中如何获取线程栈?38.如何正确设置线程池39.Synchronized有几种用途?40.sleep方法和wait方法有什么区别41.什么是线程池?为什么要使用它?42.线程运行时出现异常怎么办?43.如何控制允许并发访问线程的方法的大小?44.用户线程和守护线程有什么区别?45.线程中断可以直接调用stop吗,为什么?46.Runnable接口和Callable接口的区别47.ThreadLocal有什么用48.Java中heap和stack有什么区别?49.如何在Java中获取线程转储文件50.什么是线程调度器和时间分片?51.不使用stop来停止线程?52.SynchronizedMap和ConcurrentHashMap有什么区别?53、对于并发量大、任务执行时间短的业务如何使用线程池?并发量低,任务执行时间长的业务如何使用线程池?高并发、执行时间长的业务如何使用线程池?54、如何保证main()方法所在的线程是Java程序结束的最后一个线程?55.同步方法或同步块,哪个更好?56.线程池的作用57.CopyOnWriteArrayList可以用于哪些应用场景?58.如何创建守护线程?在哪里使用它?59.两个线程如何共享数据60.synchronized和ReentrantLock的区别61.Thread.sleep(0)的作用是什么62.线程的sleep()方法和yield()方法有什么区别?63.什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列实现生产者消费者模型?64.java中守护线程和本机线程有什么区别?65.什么是Executors框架?66.什么是JavaTimer类?如何创建具有特定时间间隔的任务?67.如何暂停一个正在运行的线程一段时间?68.什么是自旋69.Java中如何唤醒阻塞的线程?70.Java中的死锁71.start()方法和run()方法的区别72.join和start的调用顺序73.JavaConcurrencyAPI中的Lock接口(Lockinterface)是什么?与同步相比,它有什么优势?74.什么是线程池?为什么要使用它?75.线程是如何创建的76.说说你对synchronized关键字的理解77.为什么要使用Executor框架?78.线程状态79.简述线程、程序、进程的基本概念而他们之间又是什么关系呢?80.#5.同步对象实例81.#1.同步公共方法82.Executor框架的主要成员83.synchronized中包括哪两条重要的jvm指令?84.Thread类中yield方法的作用是什么?85.线程类的构造函数和调用的静态块是哪个线程?86.什么是FutureTask87。volatile关键字的作用88.什么是线程安全?89.volatile变量和atomic变量有什么区别?90.为什么wait()、notify()和notifyAll()必须在synchronized方法或synchronized块中调用?91.如何保证线程安全?92.并发容器的实现方式是什么?93.#3.同步类94.如何避免死锁和检测95.为什么使用Executor框架比使用应用程序创建和管理线程更好?96.wait()方法和notify()/notifyAll()方法放弃对象监听有什么区别97.说说synchronized关键字的底层原理98.interrupted和isInterrupted方法的区别在爪哇?99.什么是可重入锁(ReentrantLock)?100.线程池工作流程101.Java中livelock和deadlock的区别是什么?102.线程状态转换?103.104。什么是Callable和Future?105.线程的基本状态有哪些?106、为什么调用start()方法的时候执行run()方法,为什么不能直接调用run()方法?107.请说出与线程同步和线程调度相关的方法。108.什么是阻塞(Blocking)和非阻塞(Non-Blocking)?109.什么是阻塞法?110.Java中同步集合和并发集合有什么区别?111.什么是竞争条件?您如何发现和解决竞争?112、常用的线程池模式以及不同线程池的使用场景?113.死锁和活锁、死锁和饥饿有什么区别?114.Java中原子操作更新字段类,Atomic包提供了哪些类?115.提交任务到线程池116.join方法中传参和不传参的区别?117.#4.同步本实例118.如何处理线程中不可控的异常?119.在多线程中,什么是上下文切换?120.多线程有什么用?121.同步方法和同步块,哪个是更好的选择122.为什么代码会重新排序?123.Java中interrupted和isInterruptedd方法有什么区别?124.什么是线程安全125.并行和并发有什么区别?126.自旋锁的优点和缺点是什么?127.Java线程池中的submit()和execute()方法有什么区别?128.如果线程发生运行时异常会怎样?129.什么是挥发性?能保证订单吗?130.ThreadLocal的原理、注意事项、应用场景?131.线程安全的级别132.Java中notify和notifyAll有什么区别?