Java学习者需懂得的20道线程题

无论你是一个新程序员还是老手,你一定在面试中遇到了一个问题。java语言的一个重要特征是并发的内置支持,使得企业和java程序员流行。大多数的高薪职位要求开发商在开发java多线程技术熟练,有丰富的经验,在开发、调试和优化java程序,所以线程相关的问题往往在访谈中提到。

在一个典型的java面试,面试官会问从线程的基本概念,如:你为什么要使用线程,如何创建一个线程,以什么样的方式来创建一个线程更好的(例如:线程类继承或调用Runnable接口),然后逐渐向中像java并发编程所遇到的挑战问题的过程中提出问题,java内存模型,介绍了高阶并发JDK1.5并行编程工具,常用的设计模式,经典的多线程问题,如生产者和消费者,哲学家就餐问题,读者或一个简单的缓冲区。仅仅知道线程的基本概念是远远不够的。您必须知道如何处理并发问题,例如死锁、竞态条件、内存冲突和线程安全。有了这些技能,您就可以轻松地处理多线程和并发访问。

许多java程序员面试之前去面试,这是正常的。因为它需要时间来收集面试官和练习,我已经收集了50个热点问题java多线程和并发性从许多面试者。我只收集了一个比较新的面试问题,并没有提供所有的答案。你得聪明点才能回答这些问题。如果你不知道你不明白的东西,你可以用谷歌找到答案。如果你找不到答案,你可以在这篇文章的评论中向我求助。你也可以找到一些这里的java线程的问题回答前12个答案。

20道Java线程题

以下是对java线程相关的热点的面试问题,你可以用它来为面试做准备。

1) 什么是线程?

线程是操作系统能够执行操作和调度的最小单元,它包含在进程中,是进程中的实际操作单元。程序员可以使用它进行多处理器编程,并且可以使用多线程来加快操作密集型任务。例如,如果一个线程完成了100毫秒的任务,那么用十个线程完成任务只需要10毫秒。java提供了多线程的语言层良好的支持,这也是一个很好的卖点。详情请点击这里。

2) 线程和进程有什么区别?

线程是进程的一个子集,进程可以有多个线程,每个线程并行执行不同的任务。不同的进程使用不同的内存空间,所有线程共享相同的内存空间。不要将它与堆栈内存混合,每个线程都有一个单独的堆栈内存来存储本地数据。详情请点击这里。

3) 如何在Java中实现线程?

语言水平有两种说话方式。该java.lang.thread类的一个实例是一个线程,但它需要调用java.lang.runnable接口Runnable接口的实现,因为线程类本身被称为所以你可以子类化java.lang.thread或直接调用Runnable接口(运行)重写线程的实现方法。详情请点击这里。

4) 用Runnable还是Thread?

这个问题是最后一个问题的后续。我们都知道,我们可以通过继承Thread类或调用Runnable接口实现线程。问题是哪种方法更好?你什么时候用它?这个问题容易回答。如果你知道java不支持多重继承的类,它允许您调用多个接口。所以如果你想继承其他的类,调用Runnable接口很好。详情请点击这里。

6) Thread 类中的start() 和 run() 方法有什么区别?

这个问题经常被问到,但它仍然是能够区分的程度,面试官从这个地区了解java线程模型。启动()方法用于启动新创建的线程,并且在开始()中调用run()方法,这与直接调用run()方法是不一样的。当调用run()方法时,它只在原始线程中调用,没有新的线程开始,启动()方法将启动新线程。请点击这里进行更多的讨论。

7) Java中Runnable和Callable有什么不同?

既可运行和Callable代表的任务能够在不同的线程中执行。运行已经开始从JDK1.0,Callable增加在JDK1.5。主要的区别是,叫()方法可调用可以返回值和抛出异常,并运行()方法可运行不具备这些功能。可调用的可以返回到具有计算结果的未来对象。我的博客有一个更详细的描述。

8) Java中CyclicBarrier 和 CountDownLatch有什么不同?

CyclicBarrier和countdownlatch可以用来允许一组线程等待其他线程。与CyclicBarrier不同的是,countdownlatch不能重复使用。单击此处查看更多信息和示例代码。

9) Java内存模型是什么?

java内存模型指定引导的java程序的行为确定不同的内存架构之间,CPU和操作系统。在多线程的情况下,这一点尤其重要。java内存模型提供了一种保证一线的变化可以被其他线程看到的,以及它们之间的关系是第一次发生。这种关系定义了一些规则,让程序员对并发编程有一个更清晰的认识。例如,前面的关系确保了:

  • 线程内的代码可以按顺序执行,这称为程序顺序规则。

  • 对于同一个锁,在解锁操作必须在另一个锁操作之后发生,它也被称为管锁规则。

  • 上一个对易失性的写入也被称为挥发性变量规则,在后者的读操作之后。

  • 线程的任何操作都必须在线程的开始()调用之后被称为线程启动规则。

  • 在终止线程之前,线程的所有操作都将终止规则。

  • 一个对象的终结操作后的对象被构造,也叫对象终结规则。

  • 及物性

我强烈建议你阅读《java并发编程实践》第十六章深化java内存模型的理解。

10) Java中的volatile 变量是什么?

易失性是一种特殊的修饰符,只能由成员变量使用。在java并发程序的同步类缺乏的情况下,对成员变量的多线程操作对其他线程透明。易变变量确保在上一次写入操作之后发生下一个读操作,这是前一个问题的易变变量规则。点击这里查看更多关于易挥发的内容。

11) 什么是线程安全?Vector是一个线程安全类吗? (详见这里)

如果在代码所在的进程中同时运行多个线程,则线程可以同时运行代码。如果每次运行的结果与单个线程运行的结果相同,并且其他变量的值与预期的相同,则它是线程安全的。在多线程的情况下,线程安全计数器类的同一实例对象不会有计算错误。很明显,可以将集合类分成两组,线程安全和非线程安全。向量是一个实现线程安全的同步方法,而ArrayList相似,它不是线程安全的。

12) Java中什么是竞态条件? 举个例子说明。

竞争条件使程序在并发性中出现一些缺陷。当多线程竞争某些资源时,它将产生竞争条件。如果第一个程序不能执行,那么整个程序将有一些不确定的bug。由于线程之间的随机竞争,这种错误很难找到和重复。一个例子是混乱的治疗,答案是详细的。

13) Java中如何停止一个线程?

java提供了丰富的API,但不提供API来停止线程。有1个JDK像停止(),暂停()和恢复()来控制的僵局,但由于潜在的威胁,所以在JDK他们丢弃的后续版本的java API的设计方法,后将不提供兼容和线程停止一个线程安全的方法。当运行()或调用()方法执行时,线程将自动结束。如果要手动终止线程,可以使用易失性的布尔变量退出运行()方法的循环,或取消任务来中断线程。单击此处查看示例代码。

14) 一个线程运行时发生异常会怎样?

这是一个非常棘手的java面试题我遇到了在一次采访中,简单的说,如果一个异常没有被捕获该线程将停止执行。thread.uncaughtexceptionhandler是一个用于处理未捕获的异常,引起线程中断嵌入式接口。当一个未捕获的异常将导致线程中断,JVM会使用thread.getuncaughtexceptionhandler()来查询UncaughtExceptionHandler的进程和线程的线程和异常作为参数的uncaughtException()方法处理。

15) 如何在两个线程间共享数据?

您可以通过共享对象或使用阻塞队列之类的并发数据结构来实现这一点。本教程,“java线程间的通信”(涉及两个线程之间的共享对象)实现生产者消费者模型与wait和notify方法。

16) Java中notify 和 notifyAll有什么区别?

这是一个棘手的问题,因为多个线程可以等待一个监视器锁,设计师java API提供了一些方法,当等待条件变更通知他们,但是这些方法都没有完全实现。通知()方法不会唤醒特定线程,所以只有一个线程在等待时才就位。notifyAll()唤醒所有线程,并允许他们争夺锁来确保至少有一个线程可以继续运行。我的博客有更详细的信息和示例代码。

17) 为什么wait, notify 和 notifyAll这些方法不在thread类里面?

这是一个与设计有关的问题,它检查面试官对现有系统的看法,以及一些常见但似乎不合理的问题。在回答这些问题时,您必须解释为什么将这些方法放在对象类中是有意义的,为什么不把它放在线程类中呢?。一个显而易见的原因是,通过java提供的锁对象层次,不是线程级,每个对象都有一个锁,是通过一个线程获得。如果线程需要等待某些锁,则调用对象中的等待()方法是有意义的。如果在线程类中定义了等待()方法,线程等待的锁是不明显的。总之,因为等待,通知,和notifyAll锁级别的操作,它们被定义的对象类因为锁属于对象。您还可以查看本文以获得更多信息。

18) 什么是ThreadLocal变量?

ThreadLocal是java的一种特殊变量。每个线程都有一个ThreadLocal,每个线程都有自己独立的变量,和竞争状况完全消除。这是一个很好的方式来获得线程安全的对象创建昂贵的,例如,你可以使用ThreadLocal使不是线程安全的,因为该类创建一个昂贵的,每个电话需要创建不同的实例,所以不值得使用它的地方,如果你为每个线程提供一个独特的一个变量的拷贝。这将大大提高效率。首先,通过重用降低了创建昂贵对象的数量。第二,线程安全性不需要高代价同步或不变性。另一个线程本地变量很好的例子是threadlocalrandom类,从而降低了在多线程环境中昂贵的随机对象的数量。看更多的答案。

19) 什么是FutureTask?

在java的并发程序,futuretask表示异步操作可以取消。它具有启动和取消操作的方法,查询操作是否完成和结果是否被检索。只有在操作完成时才能检索结果,如果操作未完成,则get方法将被阻止。一个futuretask对象可以用对象调用调用和运行,因为futuretask也称Runnable接口,所以它可以提交执行执行。

20) Java中interrupted 和 isInterruptedd方法的区别?

之间的主要区别(中断)和isinterrupted()是前清除中断状态,后者不。java多线程的中断机制与内部认同的实现,和一个叫Thread.interrupt()中断一个线程将中断识别为真。当中断线程调用静态方法thread.interrupted()检查中断状态,清除中断状态。非静态方法isinterrupted()是用来查询其他线程的中断状态和不改变中断状态标识。在一个简单的方法,任何方法抛出InterruptedException异常将清除中断状态。在任何情况下,线程的中断都可以通过其他线程的中断来改变。

以上是20热java多线程和并发访问问题。本文不仅可以用于编写面试,还可以检查您对多线程、并发、设计模式和竞争条件、死锁和线程安全的理解。我打算把这篇文章收集了大量的所有java多线程的问题,但是如果没有你的帮助,恐惧不能完成。本文对初学者还是有经验的java开发人员,你将从两或三或五或六年的阅读中受益。它可以扩展到初学者,特别有用,因为这可以扩展他们的知识,我会不断更新这些问题。你可以在文章后面的评论中分享和回答问题,并改善面试问题。

猜你喜欢

转载自blog.csdn.net/artaganan8/article/details/88040120
今日推荐