Java 多线程并发面试问题与答案

今天,我们将探讨Java多线性访谈问题和答案,我们还将探讨竞争对手访谈问题和答案,因为多线性和共线性都是相通的。

Java Multithreading 面试问题

  1. 联合国 [进程和线程有什么区别?] (# process-vs-thread)
  2. [多线程编程有什么好处?] (#受益-多线程)
  3. [用户线索和守护进程有什么区别?] (#user-daemon-thread)
  4. [我们如何在Java中创建线索?] (# new-thread
  5. [Thread的生命周期中有哪些不同的状态?] (#thread-lifecy循环)
  6. [我们能调用线程类的跑()方法吗?] (#线程-跑-方法 . 如何在具体时间暂停执行线索?( (英语). 8. [你对线条优先级了解多少?] (#线条优先级)
  7. [线程和时间剪接是什么?] (#线程剪接) 10 (英语). [多条线中的上下文切换是什么?] (#context-switching) 11 (英语). [我们如何确定主线()是Java程序完成的最后一条线程?] (#thread-join
  8. [线程如何相互沟通?] (#线程-通信)
  9. [为什么线程通信方法等待(,通知()和通知All()属于对象类?] (#object-wait-notify)
  10. [为什么等待(,通知()和通知All()方法必须从同步方法或块调用?] (#同步-wait-notify)
  11. [为什么 Thread sleep() and complete() 方法是静态的?] (# Thread-sleep-ense-ense-static)
  12. [我们如何在Java实现线程安全?] (# Thread-safe
  13. [什么是可挥发的关键词在Java] (#挥发-关键词)
  14. [哪一种更为首选 -同步方法或同步块?] (#同步-方法-vs-块) 19 (英语). [如何在Java中创建守护进程线程?] (#deamon-thread)
  15. [什么是 Thread Local?] (#thread-local)
  16. [什么是线索组? 为什么建议它不要使用它? ](#thread-group
  17. [Java Thread Dump是什么,我们怎样才能得到一个程序的Java Thread dump?] (#thread-dump
  18. [什么是死锁? 如何分析并避免僵局?] (# deadlock)
  19. [什么是爪哇计时器类? 在特定间隔后如何安排任务运行?] (#java-timer)
  20. [什么是线索池? 如何在 Java 创建 Thread Pool?] (# Thread-pool
  21. [如果我们不超过 Thread 类跑() 方法将会发生什么 ?] (# Thread-run)

Java 竞争对手面试问题

  1. 什么是原子操作? 什么是原子类在Java Concurrency API?
  2. 什么是Java Concurrency API中的锁接口? 它在同步化方面有什么好处?
  3. 什么是调用和未来框架? 6.(#java-futuretask)( _7)(#blocking-queue) 5)5. (什么是调用和未来框架?)(#callable-future)( _6)(# )6)(什么是未来任务类?(#java-futuretask)(

Java Multithreading 面试问题与答案

  1. 联合国 ### 进程和线索有什么区别( ) 一个进程是一个自封的执行环境,可以看作是一个程序或应用,而Thread是进程内部执行的单一任务. Java运行时环境作为一个单一的过程运行,其中包含不同的类和作为进程的程序. 线程可以称为轻量级过程. 线索需要更少的资源来创建和存在于进程中,线程共享进程资源. () (英语). ### 多线程编程有什么好处? 在多线程编程中,多个线程同时执行,可以改善性能,因为CPU不是闲置的,以防有线程等待获得一些资源. 多线程共享堆积的内存,因此创建多线程来执行一些任务而不是创建多进程是好的. 例如,Servlets的性能优于CGI,因为Servlet支持多线程,但CGI并不支持. ( (英语). 4. ### 用户线索和守护进程有何区别? () ) 当我们在java程序中创建线索时,它被称为用户线程. 一个守护进程线程在背景中运行,并不妨碍JVM终止. 当没有用户线索运行时,JVM会关闭程序并退出. 从守护进程线程所创建的孩子线程也是守护进程线程.
  2. 如何在 Java 创建线索 ? (

(英语). 在 Java 中创建 Thread 有两种方法——首先通过执行 Runnable 接口,然后从它中创建 Thread 对象,其次是扩展 Thread 类. 阅读此文章以了解更多关于java中创建线. (). (英语). ### Thread的生命周期有哪些不同的状态? 当我们在java程序中创建线索时,它的状态是New. 然后我们开始线条 它的状态可以运行。 线程调度器负责将CPU分配到可运行线程池中的线程并更改状态为"跑". 其他的线索州是等待,被封锁和死亡。 阅读此帖以了解更多关于线条的生命周期. () (英语). 7. ### 我们可以调用线索类的运行方法吗? () )是的,我们可以调用线索类的跑()方法,但之后它会表现得像普通的方法. 要在线索中实际执行,我们需要使用**Thread.start()**方法开始执行.() (英语). 8. ### 如何暂停执行线索的特定时间 ? () ) 我们可以使用 Thread Class sleep () 方法来暂停 Thread 执行一段时间. 注意这不会在特定时间停止线程的处理,一旦线程从睡眠中醒来,状态就会被改变为可运行状态并基于线程,它会被执行. ( (英语). 9. ### 你对线索优先了解多少? 每个线程都有优先级,通常更高优先级线程在执行中获得优先级,但它取决于依赖OS的线程调度器执行. 我们可以指定线程的优先级,但这并不能保证更高优先级线程会在更低优先级线程之前被执行. 线索优先级为_int,其值从1到10不等,其中1为最下优先级线程,10为最优先级线程. 10. ### 线程和时间剪切是什么? 线程调度器是将CPU时间分配给可用可运行线程的操作系统服务. 一旦我们创建并开始一条线程,它的执行取决于线程的实现. 时间切分是将可用的CPU时间分给可用的可运行线程的过程. 将CPU时间分配给线程可以基于线程优先级,或者等待更长时间的线程在获得CPU时间时会获得更多的优先级. 线程无法被java控制,因此从应用程序本身控制总是更好的. 11 (英语). ### 多线程中什么是上下文切换? 上下文切换是CPU状态的存储和还原过程,以便Thread执行可以在后一时间从同点恢复. 上下文切换是多任务操作系统和支持多行环境的基本功能. 12 (英语). ### 我们如何确定主线是 Java 程序完成的最后一条线程 ? () ) 我们可以使用 Thread join() 方法,在完成主函数之前,确定程序所创建的所有线程都死了. 以下是一篇关于[ Thread join 方法 (/community/tourises/java-thread-join-example) ()的文章. )13 (英语). ### 线程如何相互沟通? 当线程共享资源时,线程之间的沟通对于协调它们的努力很重要. 对象类等 (), 通知 () 和通知 All () 方法允许线索就资源的锁定状态进行通讯 。 请检查date=中的日期值 (帮助) 校对:Soup )14 (英语). ### 线程通信方法为何在对象类中等待(,通知()和通知()? () ) 在爪哇语中 对象有监视器并等待,通知方法用于等待对象监视器或者通知其他线程,现在对象监视器是免费的. Java的线程上没有显示器,同步可以和任何对象一起使用,所以它属于对象类的一部分,这样java中的每个类都有这些基本的线程间通信方法. () (英语). 15. QQ 为什么等待( )、 通知( ) 和通知( ) 方法必须从同步方法或块调用 ? ( ) ) 当一个线程在任何对象上呼叫等待()时,它必须在对象上拥有它将要离开并进入等待状态的监视器,直到在这个对象上的任何其他线程呼叫通知(). 同样地,当一个线程在任何对象上呼叫通知()时,它会把监视器留在对象上,而其他等待线程可以在对象上得到监视器. 由于所有这些方法都要求Thread拥有对象监视器,这只能通过同步实现,所以需要从同步方法或块来调用. 16. ### 为什么 Thread sleep( ) 和 commit( ) 的方法是静态的 ? ( ) ) 线程睡眠( ) 和出( ) 目前执行线程的方法工作 。 因此在等待状态的其他线条上引用这些方法是没有意义的. 因此,这些方法是静态的,这样当这种方法被叫作静态时,它就在当前执行线程上起作用,并避免给程序员造成混淆,他们可能认为可以在一些非运行线程上引用这些方法. () )17 (英语). ### 如何在Java实现线程安全? ( (英语). 在java-同步,原子并发类中实现线程安全有几种方法,实施并发的Lock接口,使用可挥发的关键词,使用不可移动类和线程安全类. 在线上安全辅导学习更多。 () )18 (英语). ### 在Java 中什么是可挥发关键词,当我们使用可起伏关键词带有变量时,所有的线程都直接从内存读取了它的价值而不要缓存. 这可以确保读取的值与内存中的值相同. () )19 (英语). ### 偏好哪个 - 同步方法或同步块 ? () )同步块比较首选的方式是因为它不锁定对象,同步方法锁定对象,如果类中存在多个同步块,即使它们没有关联,也会阻止它们执行,并把它们放入等待状态以获得对象的锁定. () )20 (英语). ### 如何在 Java 创建守护进程线程 ? () ) 线索类设置Daemon( true)可用于在java中创建守护进程线程. 我们需要在调用启动()方法之前使用这种方法, 否则它会丢弃非法 Thread State Excuseion 。 () )21 (英语). ### 什么是线程本地化? Java线程本地化用于创建线程本地变量. 我们知道,一个对象的所有线程都共享它的变量,因此,如果变量不是安全线程,我们可以使用同步,但是如果我们想要避免同步,我们可以使用线程本地变量. 每个线程都有自己的线程本地变量,它们可以使用线程本地变量获得()和设置()方法来获取默认值或将其本地值更改为线程. Thread Local 实例通常是类中的私人静态字段,希望将状态与线程联系起来. 请检查access-date=中的日期值 (帮助) 请检查access-date=中的日期值 (帮助) 小例程序显示 [Thread Local example] (/community/tutoris/java-thread local-example) (). )22 (英语). ### 线索组是什么? 为什么建议它不要使用它? ThreadGroup是一个旨在提供线组信息的类. 线索 组 API弱而没有任何功能不是由Thread提供的. 它有两个主要特征——在线程组中获取活动线程列表,并设置未抓取的例外处理器来进行线程. 但Java 1.5 添加了 setUncaught ExceptionHandler(Uncaught ExceptionHandler eh)方法,我们可以使用这种方法在线程中添加未被找到的例外处理器. 因此 ThreadGroup 已经过时,因此不再建议使用. {} t1. set Uncaught ExceptionHandler(新 Uncaught ExceptionHandler (){ () ) @Override 公用空虚未被发现(Tread t,可抛出 e) { (- ) system.out.println ("例外发生:"+e.getMessage ()"); (- ) (- ); (- ) (- )23. ### 贾瓦线垃圾箱是什么? 如何让 Java 线索丢弃程序 ? ( ) ) 线程堆放是所有在JVM中活动的线程列表,线程堆放非常有助于分析应用中的瓶颈并分析僵局情况. 我们能使用多种方式生成 Thread dump - 使用配置器, Kill - 3 命令, jstack 工具等. 我更喜欢Jstack工具生成一个程序的线程堆放,因为它很容易使用,并随着JDK的安装而来. 由于这是一个基于终端的工具,我们可以创建一个脚本,以定期生成线程堆放来分析后期. 阅读此帖,可了解更多关于[在java中生成线条堆 (/社区/tourises/java-thread-dump-visibalvm-jstack-kill--3-jcmd. )24 (英语). ### 死锁是什么? 如何分析和避免僵局? Deadlock是两个或两个以上线程被永久屏蔽的一种编程状态,这种情况的出现至少有两个线程和两个或两个以上资源. 为了分析一个僵局,我们需要查看应用程序的java线程堆放,我们需要注意作为BLOCKED状态的线程,然后它等待锁定的资源,每一种资源都有一个独特的ID,我们用它可以找到已经锁定对象的线程。 避免锁定, 只锁定 需要和避免无限期等待的是什么是避免僵局的常见方法,阅读这篇文章以学习如何用样本程序[分析java的僵局](社区/教义/死锁-in-java-example). () )25 (英语). ### Java计时器课是什么? 如何在指定间隔后安排任务 ? () ) (日语). util. 定时器(Timer)是可用于计划未来某个时间执行的线程的实用类. 爪哇语 计时班可以用来安排一个需要一次性运行或定期运行的任务. Java.util (法语). TimerTask是一个**[抽象类] (/community/tourics/abstract-class- in-java"Abstract Class in Java with example")**,它执行可运行接口,我们需要扩展这一类,以创建我们自己的TimerTask,可以使用java Timer Class进行排程. 请检查access-date=中的日期值 (帮助) [java Timer example] (/community/tutors/java-timer-timer-timertsk-example). () )26 (英语). ### 线索池是什么? 如何在 Java 创建线索池 ? ( ) 一个线程池管理着工人线程的池,它包含一个队列,让任务等待执行. 一个线程池管理 Runnable 线程的集合, 工人线程执行 Runnable 从队列中执行 。 java.util.concur. Executors提供java.util.concur.Executor接口以创建java中的线程池. [线索 Pool示例 (/community/tourics/threadpoolexecutor-java-thread-pool-example-executservice)程序显示如何在java创建和使用 Thread Pool. 或读取 [ScheduledThreadPoolExecutor example] (/community/tutorys/java-scheduledexuter service-scheduledthreadpoolexecutor-executor-executor-execample),以了解在某些延迟后如何安排任务. () )27 (英语). ### 如果我们不超越 Thread 类运行方法, 会发生什么 ? ( _) ) Thread class run () 方法代码如下:
公共空跑 () { 如果(目标!=无效) { target.run (); } } (Above) 方法在 Thread class () 方法中设定的目标,如果我们创建 Thread class 实例为 新的 Testhread () , 则设定为无效 。 因此,如果我们不推翻运行方法,就不会发生任何事情。 下面是一个简单的例子,说明这个. { 公共类测试Thread扩展了 {

// 不压倒 Thread.run() 方法(- ) / 主要方法,也可以在其他类中 公共静态真空主干线(String args [] (_ ) Thread t = 新的测试Thread (); System.println ("Bread起线"); t.start ("起线后") ; (KBR1) } }(KBR1__) ) Q 它只会被打印到输出下方并终止.___() (英语). 起始线程前 起始线程后 QQ

Java 竞争对手面试问题和答案

  1. 联合国 ### 什么是原子操作? Java 共通币 API 中的原子类是什么 ? 原子操作在一个任务单元中进行,不受其他操作的干扰. 原子操作在多线性环境中是必要的,以避免数据不一致. int++ 不是一个原子操作。 所以当一个线程读出它的值并逐一递增时,另一个线程读出更古老的值导致错误的结果. 要解决这个问题,我们必须确保计数的增量操作是原子的, 我们可以使用同步操作, 但是Java 5 java. util.congeneration. 原子提供了整数和长数的包装类, 可以在不使用同步操作的情况下用于实现这个原子化。 到本条中去更多地了解原子并发类。 () (英语). ### Java Contimen API 中的 Lock 接口是什么 ? 它比同步有什么好处? Lock接口提供比使用同步方法和语句所能得到的更广泛的锁定操作. 它们允许更灵活的结构,可能具有相当不同的属性并可能支持多个相关的条件对象. 锁的优点是——可以使其公平 ——可以在锁对象上等待时使线程响应中断. () ) - 有可能尝试获取锁,但如果锁无法获取,则立即返回或超时后返回
  • 可以在不同范围,不同订单中获取并释放锁(). ) 更多信息,请查阅[贾瓦锁例] (/community/tutoris/java-lock-example-reentrantlock). (). (英语). 4. ### 什么是执行框架? () ) 在Java 5中,执行器框架被引入了java.util.concurrent. 执行器接口 。 执行者框架是一个框架,用于按照一套执行政策,对同步任务的引用、时间安排、执行和控制进行标准化。 创造出许多没有极限界限的线程会导致应用程序耗尽堆积内存. 因此,创建 ThreadPool是一个更好的解决方案,因为有限的线程可以被集合并再用. 执行者框架促进在java创建 Thread 池的过程. 检查此帖以学习示例代码 [使用执行器框架创建线程池] (/community/turials/threadpoolexecutor-java-thread-pool-example-executorservice) (). (英语). 5. ### 什么是"封锁队列"? 如何使用屏蔽队列执行生产者-消费者问题? () ) java.util.concurrent. BlockingQuee是支持等队列在取回并去除一个元素时成为非空的操作的队列,在添加一个元素时等待队列中空出空间. 封锁 如果您试图在队列中存储无效值, 队列不接受无效值并丢弃 NullPointer Exception 。 封锁 队列执行是线性安全. 所有排队方法都属于原子性质,并使用内锁或其他形式的通货控制. 封锁 等同界面是Java收藏框架的一部分,它主要用于执行生产者-消费者问题. 请检查access-date=中的日期值 (帮助) 生产者-消费者问题使用屏蔽Quue. () (英语). ### 什么是可召唤和未来? () ) Java 5引入了java.util.concyn. 在类似 Runnable 接口的可调用界面包中,它可以返回任何对象并能够抛出例外. Callable 接口使用通用来定义对象的返回类型. 执行者类为在线程池中执行Callable提供了有用的方法. 由于可调用的任务并行运行,我们必须等待返回的对象. 可调用的任务返回 java. util. concent. 未来对象. 使用 未来我们可以找出可调用任务的状况,并获得返回的对象. 它提供了可以等待Callable完成然后返回结果的得到()方法. 请检查access-date=中的日期值 (帮助) [Callable Future example] (/community/tourises/java-callable-future-example) (). (英语). 7. ### 未来任务类是什么( _) )"未来任务"(Future Task)是"未来"接口的基础执行类,我们可以与执行器一起用于同步处理. 大部分时候,我们不需要使用FutureTask类,但是如果我们想超越Future接口的一些方法,想要保留大部分基础执行,它就非常方便. 我们可以按照我们的要求 扩大这个类别 并推翻方法 请检查access-date=中的日期值 (帮助) ** [Java未来任务例] (/community/tourises/java-futureturs-example-program) (中文(简体) ). "Java Future Task Example Program")** 来学习如何使用以及它有哪些不同的方法.
  1. 同步收藏类是什么? (_)

) Java Collection 类为故障快取,这意味着如果当某些线程在使用迭代器翻转时会更改收藏, 迭代器. next () 将丢出 ConvolutionModization Exception 。 同时期收藏类支持检索的全部货币和可调整的预期货币以进行更新。 主要班级有: ConforceHashMap, CopyOnWriteArrayList和 CopyOnWriteArraySet, 请检查此站点以学习[如何避免使用Isterator时的 Conforce-ModificationException] (/community/tutoris/java-util-同流异化例外). ( (英语). 9. ### 执行者类是什么( ) ) 执行器类为执行器,执行器服务,下表执行器服务,线程档案,和可调用类提供实用方法. 执行器类可以方便地在java创建 Thread Pool,这也是唯一支持 Callable 执行的类. () )10 (英语). ### Java 8 中的 Conmunicipal API 有哪些改进( _) ? ) 一些重要的并行API增强是:- CompentHashMap compute (), forEach (), forEach (), forEachEntry (), forEachKey (), forEachValue (), computing () and search () 方法.

  • 可直接完成的可完成未来(确定其价值和地位).
  • 执行器新WorkStealingPool () 方法,以所有可用的处理器作为其目标并行级创建工作蒸馏线池. (_) ) ** 建议读取**:[Java 8地貌 (/社区/地貌/java-8地貌-有-例) "Java 8 开发者的特性 — lambdas,功能界面,流和时间 API"

这就是Java Thread和Concurrency采访问题,我一直在为这个列表添加更多。

Published At
Categories with 技术
comments powered by Disqus