Java面试题-多线程
- 1、Java多线程是什么?
- 2、Java中实现多线程有哪些方式?
- 3、如何停止一个正在运行的线程?
- 4、notify()和notifyAll()有什么区别?
- 5、sleep()和wait()有什么区别?
- 6、volatile是什么?可以保证有序性吗?
- 7、Thread类中的start() 和 run()方法有什么区别?
- 8、为什么wait,notify和 notifyAll这些方法不在thread类里面?
- 9、为什么wait和notify方法要在同步块中调用?
- 10、Java中interrupted 和 islnterruptedd方法的区别?
- 11、synchronized 和 ReentrantLock 有什么不同?
- 12、假设有三个线程T1,T2,T3,如何保证顺序执行?
- 13、SynchronizedMap和ConcurrentHashMap有什么区别?
- 14、什么是线程安全?
- 15、Thread类中的yield方法有什么作用?
- 16、Java线程池中submit() 和 execute()方法有什么区别?
- 17、说一说对于synchronized关键字的了解?
- 18、说说怎么使用 synchronized 关键字?
- 19、Vector是一个线程安全类吗?
- 20、常用的线程池有哪些?
- 21、说说你对线程池的理解?
- 22、Java程序是如何执行的?
- 23、产生死锁的必要条件是什么?
- 24、如何避免死锁?
- 25、线程池核心线程数怎么设置呢?
- 26、Java线程池中队列常用类型有哪些?
- 27、线程安全需要保证几个基本特征?
- 28、线程之间是如何通信的?
- 29、说一-说CAS的原理?
- 30、引用类型有哪些?有什么区别?
- 31、说说CAS的优缺点?
- 32、说说ThreadLocal原理?
- 33、说说线程池原理以及核心参数?
- 34、线程池的拒绝策略有哪些?
- 35、说说你对JMM内存模型的理解?为什么需要JMM?
- 36、多线程有什么用?
- 37、说说CyclicBarrier和CountDownLatch的区别?
- 38、什么是Callable和Future?
- 39、什么是阻塞队列?实现原理是什么?
- 40、什么是多线程中的上下文切换?
- 41、什么是Daemon线程?它有什么意义?
- 42、说说乐观锁和悲观锁的理解及实现方式?
- 43、为什么要使用并发编程?
- 44、多线程有哪些业务应用场景?
- 45、并发编程有什么缺点?
- 46、并发编程的三个必要因素是什么?
- 47、在Java程序中怎么保证多线程的运行安全?
- 48、并行和并发有什么区别?
- 49、使用多线程的好处坏处有哪些?
- 50、什么是线程和进程?
- 51、说说进程与线程的关系与区别?
- 52、什么是上下文切换?
- 53、什么是守护线程?
- 54、什么是用户线程?
- 55、守护线程和用户线程有什么区别?
- 56、什么是线程死锁?
- 57、说说创建线程的四种方式?
- 58、说一下runnable 和 callable有什么作用?它们有什么区别?
- 59、为什么调用 start()方法时会执行run()方法,为什么不能直接调用run()方法?
- 60、Java 中用到的线程调度算法是什么?
- 61、什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )?
- 62、说说与线程同步以及线程调度相关的方法及作用?
- 63、如何调用wait()方法?使用if块还是循环?
- 64、为什么线程通信的方法wait(),notify()和notifyAll()都被定义在Object类里?
- 65、为什么 wait(), notify()和 notifyAll()必须在同步方法或者同步块中被调用?
- 66、Thread类中的yield方法有什么作用?
- 67、为什么Thread类的sleep()和 yield()方法是静态的?
- 68、线程的sleep()方法和yield()方法有什么区别?
- 69、Java如何停止一个正在运行的线程?
- 70、Java 中interrupted 和 islnterrupted 方法的作用和区别?
- 71、怎样唤醒一个阻塞的线程?
- 72、notify() 和 notifyAll()有什么区别?
- 73、如何在两个线程间共享数据?
- 74、如何实现多线程之间的通讯和协作?
- 75、同步方法和同步块,哪个是更好的选择?
- 76、什么是线程同步和线程互斥,有哪几种实现方式?
- 77、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
- 78、如果提交任务时线程池队列已满,这时会发生什么?
- 79、什么叫线程安全?servlet是线程安全吗?
- 80、怎么保证多线程的运行安全?
- 81、说说对线程优先级的理解?
- 82、线程类的构造方法、静态块是被哪个线程调用的?
- 83、Java 中怎么获取一份线程dump文件?如何在Java 中获取线程堆栈?
- 84、一个线程运行时发生异常会怎样?
- 85、Java线程数过多会造成什么影响异常?
- 86、多线程的常用方法有哪些?分别有什么作用?
- 87、线程之间如何通信及线程之间如何同步?
- 88、Java中垃圾回收有什么目的?什么时候进行垃圾回收?
- 89、如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
- 90、finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
- 91、什么是重排序?
- 92、重排序实际执行的指令步骤是怎样的?
- 93、重排序遵守哪些规则?
- 94、as-if-serial规则和happens-before规则的区别?
- 95、说一下synchronized 底层实现原理?
- 96、说说并发关键字synchronized ?
- 97、synchronized可重入的原理是什么?
- 98、什么是自旋
- 99、多线程中synchronized 锁升级的原理是什么?
- 100、线程B怎么知道线程A修改了变量?有哪些方法?
- 101、当一个线程进入一个对象的 synchronized方法A之后,其它线程是否可进入此对象的synchronized 方法B?
- 102、说说synchronized、volatile、CAS 三者的作用和异同?
- 103、synchronized 和 Lock 有什么区别?
- 104、synchronized 和 ReentrantLock 区别是什么?
- 105、Java 中能创建 volatile数组吗?
- 106、volatile 变量和atomic变量有什么不同?
- 107、volatile能使得一个非原子操作变成原子操作吗?
- 108、synchronized 和 volatile 的区别是什么?
- 109、final不可变对象,它对写并发应用有什么帮助?
- 110、Lock 接口和synchronized 对比同步它有什么优势?
- 111、什么是CAS?
- 112、CAS(Compare-And-Swap)可能会产生什么问题?
- 113、什么是原子类?
- 114、常用的原子类有哪些?
- 115、说一下 Atomic的原理?
- 116、说说死锁与活锁?它们的区别是什么?
- 117、说说死锁与饥饿?它们的区别是什么?
- 118、什么是线程池?
- 119、线程池的作用有哪些?
- 120、线程池有什么优缺点?
- 121、什么是ThreadPoolExecutor?
- 122、什么是Executors?
- 123、Java中创建线程池的主要方式有哪些?
- 124、Executor 和 Executors 的区别是什么?
- 125、Executors四种构建线程池的区别及特点?
- 126、线程池都有哪些状态?
- 127、线程池中 submit() 和 execute() 方法有什么区别?
- 128、什么是线程组,为什么在Java 中不推荐使用?
- 129、ThreadPoolExecutor的饱和策略主要有哪些?
- 130、Java 中如何自定义线程线程池?
- 131、说说线程池的执行原理?
- 132、如何合理分配线程池大小?
- 133、什么是CPU密集任务?
- 134、什么是IO密集任务?
- 135、ArrayList和Vector有什么不同之处?
- 136、为什么HashTable是线程安全的?
- 137、Java中的同步集合与并发集合有什么区别?
- 138、SynchronizedMap 和 ConcurrentHashMap有什么作用?区别?
- 139、CopyOnWriteArrayList 的使用场景?有什么优缺点?
- 140、什么是并发队列?
- 141、说说并发队列和并发集合的异同点?
- 142、怎么判断并发队列是阻塞队列还是非阻塞队列?
- 143、说说阻塞队列和非阻塞队列区别?
- 144、常用并发列队有哪些?
- 145、并发队列的常用方法有哪些?
- 146、常用的并发工具类有哪些?
1、Java多线程是什么?
Java多线程是Java语言支持的一种并发编程机制,允许同时执行多个线程,即程序中的多个执行路径。每个线程都是程序中的一个单独的执行流程,它们可以同时运行,共享相同的内存空间和资源,但执行不同的任务。通过多线程,可以提高程序的执行效率和响应速度,特别是在进行大量计算或处理I/O密集型任务时。
2、Java中实现多线程有哪些方式?
主要有以下几种方法:
- 继承
Thread
类:创建一个新的类继承Thread
类,并重写run
方法来定义线程执行的任务。然后创建该类的实例并调用其start
方法来启动线程。 - 实现
Runnable
接口:创建一个类实现Runnable
接口,并实现run
方法。然后将该类的实例作为参数传递给Thread
类的构造器,创建Thread
对象后调用其start
方法来启动线程。 - 实现
Callable
接口:与Runnable
类似,但Callable
可以返回结果并能抛蠡异常。Callable
任务需要通过FutureTask
包装器来创建,并传递给Thread