U盘PE| w764位旗舰版下载 | U盘装win7系统 | U盘启动 |win7pe | win10下载 |加入收藏土豆PE官网U盘PE,U盘装win7系统,win7pe,U盘启动,U盘装系统,w764位旗舰版下载站!
当前位置:主页 > 帮助中心 > 常见问题解答 >

开发面试必备-多线程-Java线程常见问题集锦之NO1

来源:http://www.tudoupe.com时间:2022-06-23

Java线程
1什么是线程?

线性是操作系统最小的单元,能够执行操作调用,这个过程也包括在内,是工程中的实际操作单位。程序员可以用它编程多处理器,你可以使用多个线程来加速密集的任务。比如,如果一个线程在100毫秒内完成任务,用十个线程完成一个更改任务只需要10毫秒。Java提供了语言一级的多线性编程的卓越支持,这也是一个好卖点。

两个线程和进程之间的区别是什么?

线程是一个进程的子集,一个进程可以有多个线程,每个线程同时执行不同的任务。 不同的进程使用不同的内存空间,所有线程共享相同的内存空间。

3如何在Java中实现线程?

在语言层面上,这样做有两种方法。线程类的一个例子是线程,但它需要调用 java.lang.Runnable接口执行,你可以继承Java,因为线程类本身就是调用Runnable interface.lang。 线程类或直接调用Runnable interface来重写实现线程的run()方法。

可运行还是线程?

这 一 问 题 是 上文 所述 的,我们都知道通过继承线程类或调用可运行接口来实现线程。问题是,那个方法更好呢?你在什么情况下使用它?这个问题很容易回答。如果你知道Java不支持类多继承,但它允许您调用多个接口。所以如果你想继承其他类别的话,当然, 请调用可运行接口.

在5Thread类中, start()和run()方法有什么区别?

人们常常问,但是,仍然可以区分面试官对Java线程模型的理解程度。start()方法用于启动新创建的线程,start()内部调用运行()方法,这与直接调用运行()方法不同。当您调用运行()方法时,只在原始线程中调用,没有新的线程被激活,start()方法将启动新的线程。

Java中可运行和可调的区别是什么?

Runnable 和 Callable 代表在不同的线程中执行的任务。从JDK1.0开始运行,JDK1中可调用,增加5。它们之间的主要区别在于 Callable 的 call() 方法可以返回值并抛出异常,Runnable run()方法没有这些函数。可调用可以返回一个将负载计算结果的未来对象.

7Java中CyclicBarrier和CountDownLatch有什么区别?

CyclicBarrier和CountDownLatch可以用来让一个组线程等待其他线程。 与CyclicBarrier不同,countdownLatch不能再使用。

什么是Java内存模型?

Java内存模型定义和指导不同内存架构、CPU和操作系统之间的Java程序的行为。它在多线性情况下尤为重要。Java内存模型提供了保证,修改一个线程可以被其他线程看到。他们之间的关系已经存在。这种关系定义了一些规则,使程序员更清楚地考虑共同编程。比如,现有关系确保:
线程中的代码可以按顺序执行, 称为程序顺序规则.
对于相同的锁,一个解锁操作必须在另一个锁操作发生之前发生,也称为线程锁定规则。
它也被称作波动变量规则,在波动的第一个写操作和波动的第二个读操作之前。
任何在线程内操作必须称为该线程的开始(), 也称为线程开始规则。
所有线程的操作都要求在在线线程结束之前终止线程。
一个对象的终止操作必须在构建该对象后完成,也称为对象终止规则。
可传递性

Java中的波动变量是什么?

挥发性是一种特殊的变量,只有一个成员变量才能使用它。在Java编译器中没有同步类,成员变量上的多线性操作对其他线程具有透明性。波动性变量确保下一个读取操作在前面的读取操作之后发生,这是前面的问题的波动性变量规则。

什么是线性安全? 是向量线性安全类 吗?

如果您在程序中同时运行多个线程,在代码的位置上,这些线程可能同时运行这个代码。如果每个运行的结果与单个运行的结果相同,其他变量的值也与预期一样,就是线程安全的。如果多个线程使用相同的实例对象,那么一个线程安全的编译类不会被误导。很明显,你可以把集合类分成两组,线性和非线性安全。Vector是实现线程安全的一种同步方法,而与它相似的ArrayList不是线程安全。

Java的运行条件是什么? 举个例子来说明.

同时的条件可能导致某些错误在程序的同时实例中发生。对某些资源的多线性竞争创造竞争条件,如果第一个要执行的程序之后无法执行,然后将在整个程序中出现一些不确定的错误。这些错误很难检测,而且可能重复发生。因为线程间的随机竞争.一个例子是无序处理。

如何停止Java中的线程?

Java提供了非常丰富的API,但没有提供停止线程的API。JDK 1.0最初有停止()、暂停()和恢复()等控制方法,但由于潜在的僵局威胁,它们在随后的JDK版本中被放弃,后来,Java API 设计者没有提供一个兼容和线程安全的线程停止方法。当运行()或调用()方法执行时,线程自动结束。如果您想手动结束线程,你可以使用挥发的布尔变量来退出运行()循环,或者取消任务来中断线程。

当一个线程运行时发生什么异常?

这是一个非常棘手的Java面试问题,我在一个面试中遇到,简单地说,如果异常没有被捕获,线程将停止执行。Thread.UncaughtExceptionHandler是一个嵌入式接口,用于处理导致线程突然崩溃的未找到异常。JVM使用线程,当一个未观察的异常导致线程的断裂时。 getUncaughtExceptionHandler()查询线程的UncaughtExceptionHandler,并处理线程和异常作为参数传递给处理器的uncaughtException()方法。

14如何在两个线程之间共享数据?

你可以通过共享对象或者使用数据结构,例如阻塞队列。

在Java中,通知和notifyAll有什么区别?

这是另一个棘手的问题。因为多个线程可以等待一个监视锁,Java API 设计者提供一些方法通知它们,等条件发生变化时,但这些方法尚未充分实施。通知()方法不能唤醒特定线程,所以只有一个线可以用于等待战争。NotifyAll()使所有线程醒来,并允许它们进行锁定竞争,以确保至少一个线程能够继续运行。


为什么等待、通知和通知这些方法都不在线程类中?

这是一个与设计有关的问题,它考察了面试官对现有系统的看法,以及一些常见但看似不合理的事物。回答这些问题时,你想解释为什么把这些方法放在对象类中是有意义的。还有理由不将它放在线程类中。一个明显的原因是Java提供的锁是对象级而不是线程级,每个对象都有锁,通 过线程获得。如果线程需要等待某些锁 then wait() 方法在调用对象中有意义。如果 wait() 方法在线程类中定义,线程等待的锁不明确.简单的说,由于wait,通知和通知所有是锁级操作,因此在对象类中定义它们,因为锁属于对象。

什么是 ThreadLocal变量?

ThreadLocal是Java的一个特殊变量。每个线程都有 threadLocal,这意味着每个线程都有自己的独立变量。竞争条件已经消除。这是创建昂贵的对象的线程安全的好方法,例如,你可以使用ThreadLocal来使SimpleDateFormat安全,因为创建该类是昂贵的,需要在每次调用中创建不同的实例,因此不值得在本地使用。如果为每个线程提供唯一的变量拷贝,将大大提高效率。首先,通过重用减少了制造昂贵物品的数量。其次,无需使用昂贵的同步或不变性来实现线程安全性。另一个很好的线程本地变量例子是 ThreadLocalRandom类。它减少了在多向环境中创建昂贵的随机对象的数量。

未来任务是什么?

在Java中,FutureTask表示可以取消的非同步操作。它有启动和取消操作的方法,询问操作是否完成,以及恢复操作结果。只有在操作完成后才能恢复结果。如果操作未完成,获取方法将被封锁。一个FutureTask对象可以包入 Callable和Runnable的对象,由于FutureTask还叫Runnable接口,它可以提交执行器执行。

在Java中,中断和中断的方法有什么区别?

interrupted()和 isInterrupted()之间的主要区别是,前者会清除中断状态,后者不会。通过内部识别实现Java多个线程的中断机制,调用 thread.interrupt()来中断一个线程将设置中断标识符为 true。中断线程调用静态方法 Thread.interrupted()来检查中断状态,中断状态会被清零。非静态方法 isInterrupted()用于查询其他线程的中断状态,并不会改变中断状态标识符。简单地说,任何抛出InterruptedException例外的方法都会将中断状态清除到零。无论如何,线程中断状态可能被其他调用调用线程中断。

21为什么在同步块中应该调用等待和通知方法?

这主要是因为Java API 需要这样做,如果你不这样做,代码就会抛出 IllegalMonitorStateException 例外。

为什么在循环中检查等待条件?

一个等待状态的线程可能收到错误警告和错误觉醒,如果等待条件在循环中没有检查,该程序 exit without satisfying the end condition.因此,当一个等待的线条醒来时,不能假定它原来的等待状态仍然有效,在通知()方法调用后和线程醒来之前,这个时间可能会发生变化。这是在循环中使用等待方程的最好原因。您可以创建一个模板,在Eclipse中调用等待和通知来尝试。如果你想了解更多有关这个问题,我建议您阅读《有效的Java》中的线程和同步章节。

在Java中,同步集和同步集有什么区别?

同步集和兼容集为多个线程和兼容集提供了合适的线程安全集。然而,共发电组的可扩展性更高。在Java 1.Prior to 5中,程序员只使用同步集,在多个线程共存时可能造成冲突。阻碍系统扩张。Java 5引入了共生成集ConcurrentHashMap。除了提供线程安全外, 现代技术如锁隔离和内部分离改善了可扩展性.

Java中的堆栈与堆栈之间的区别是什么?

为什么把这个问题分类为多线性和平行面试问题?因为堆栈是一个与线程密切相关的内存。每个线程都有自己的堆栈内存,用于存储本地变量,方法参数和堆栈调用,在一个线程中存储的变量对其他线程来说是看不见的。堆栈是所有线程共享的公共存储区。对象都在堆里创建,为了提高效率,线程将从堆栈中获取一个缓存到自己的堆栈,如果多个线程使用这个变量,问题可能会发生,在这一点上,波动性变量可以发挥作用。它需要线程从主存储器读取变量值。

什么是线程池?为什么使用它?

创建一个线程需要昂贵的资源和时间,如果一个任务到达创建一个线程,则响应时间会发生变化,进程可以创建的线程数量有限。为了避免这些问题,当程序启动时,它创建多个线程来响应处理,它们被称为线程池,内部的线被称为工作线。从JDK1开始5点,Java API提供了一个执行器框架,允许您创建不同的线程库。比如单线程池,处理一次任务;一个固定的线程库或缓存的线程库(适用于许多短期任务的可扩展线程库)。

如何写代码来解决生产商和消费者的问题?

实际上,你解决的许多线性问题属于生产者-消费者模式,这是其他生产线的生产任务,你必须知道如何沟通线程来解决这个问题。低层次的方法是使用等待和通知来解决问题。比较的方法是使用Semaphore或BlockingQueue来实现生产者 - 消费者模型.

如何避免僵局?
Java多向导中僵局
僵局是指执行过程中的两个或多个进程。因资源竞争而造成彼此等待的现象,若无外力作用,他们将无法向前迈进。这是一个严重的问题,因为一个僵局会让你的程序悬挂并且无法完成任务,僵局的发生必须满足下列四个条件:
拒绝条件: 资源每次只能由一个进程使用.
请求和保留条件: 当一个进程被请求资源阻塞时,获得的资源被保留。
不剥夺已获得资源的程序的条件,不能在其使用结束之前强迫剥夺这些资源。
循环等待条件: 几个过程之间形成一个循环等待资源关系.
避免僵局的最简单的方法是停止循环等待的状况,将系统中的所有资源设置到标记位置和顺序,并要求所有进程应用程序资源以一定顺序(上下)运行,以避免僵局。

在Java中,活锁和死锁有什么区别?

这是上题的扩展,活锁和死锁类似,不同的是,处于主动锁定状态的线程或过程的状态不断变化。活锁可以被认为是一种特殊的饥饿.一个真实生活锁的例子是两个人在一个狭窄的走廊里相遇,他们俩都设法避开对方,以便彼此通行。但由于逃跑的方向是相同的,所以没有人能够通过走廊到达终点。简单的说就是,活锁和死锁之间的主要区别是,以前的进展状态可以改变,但不能继续。

如何检测一个线程是否有锁?

我一直在想,我们是否能检测一个线条是否有锁,直到我参加了电话面试。在Java.lang中,有一个叫做 holdsLock()的线程方法,如果当前线程在特定对象上有一个锁,则返回真值。

如何在Java中创建一个线程堆栈?

对于不同的操作系统,有许多方法来获取一个Java进程的线程堆栈。当你得到一个线程堆栈时,JVM将所有线程的状态存储在日志文件中,或将它们输出到控制台。在Windows中,你可以使用 Ctrl + Break 组合键来获取一个线程堆栈,Linux使用 kill -3命令。你可以使用jstack工具获取它,它运行在线程ID上,你可以使用jps工具找到ID。


31JVM中的参数是用于控制线程的小堆栈

问题很简单:-Xss参数用于控制线程堆栈大小。

32在Java中同步和ReentrantLock有什么区别?

长期以来,Java只能通过同步的关键词来拒绝。它有一些缺点。例如,你不能延伸出锁或阻塞边界,在尝试锁定等时无法终止.Java 5通过锁接口提供了更复杂的控件来解决这些问题。ReentrantLock类实现Lock,它具有同步的一致性和记忆语义,并且可扩展。

有三个线程:T1、T2和T3。我怎样确保它们按顺序执行?

在多个线程中,有多种方式执行线程在一个特定的顺序。您可以使用线程类的 join() 方法在一个线程中启动另一个线程,另一个线程完成线程并继续执行。为了确保三个线程的顺序,你应该先启动最后一个线程(T3调用T2,T2调用T1),因此T1先完成,T3最后完成。

在线程类中产出方法的影响是什么?

产量方法可以暂停当前运行的线程对象,允许执行同样优先级的其他线程。它是静态的方法,只保证当前线程将放弃CPU使用,而不是保证其他线程能够使用CPU。执行 yield()的线程很可能在进入停顿状态后立即执行。

在Java中,ConcurrentHashMap的一致性是什么?

ConcurrentHashMap将实际地图分成几个部分实现其可扩展性和线程安全性。这个区别是通过使用系数来得到的,它是ConcurrentHashMap类构造函数的一个可选参数,默认值为16,这在多个线程的情况下可以避免。

36Java中的Semaphore是什么?

Java中的Semaphore是新的同步类,它是一个计数信号。从概念上讲,从概念上讲,信号数量保持了一系列的权限。如有必要,在许可证发售前封锁所有获取(),然后再获取该许可。每个发布()都会添加一个许可证,因此,可以释放阻塞的接收者。但是,不使用实际的授权对象,Semaphore只计数授权的数字,并采取适当行动。信号数量常用于多个线程的代码中。比如数据库连接池。

如果您提交一个任务,线程池队列已经满了。 我们见面时会发生什么事?

这个问题很棘手。许多程序员会认为任务将被封锁,直到线程池队列空。事实上,如果一个任务不能预定执行,那么 ThreadPoolExecutor的 submit() 方法将抛出 RejectedExecutionException例外。

38在Java线程库中提交()和执行()方法的区别是什么?

这两个方法可以将任务提交到线程池中,执行()方法的返回类型无效,它在执行器接口中定义, submit()方法可以返回包含计算结果的Future对象,它在ExecutorService接口中定义,它扩展执行器接口,其他线程池类,如 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 都有这些方法。

39阻塞方法是什么?
阻塞方法意味着程序会等待方法完成,而不做任何其他事情,ServerSocket的接受()方法是等待客户端连接。这个块在返回之前指的是调用结果,当前线程会被挂起,直到得到结果,它才会返回。此外,还有非同步和非阻塞的方法,它们会在任务完成之前返回。


Swing线是否安全?为什么?

你可以肯定地回答,Swing不是线程安全的。但是你应该解释你为什么这样做,即使面试官没有问你为什么。当我们说摆动不是线程安全的时,我们经常提到它的组件。这些组件不能在多个线程中修改,所有对GUI组件的更新都是在AWT线程中进行的,Swing提供了同步和非同步调制方法来更新.

invokeAndWait和invokeLater在Java中有什么区别?

这两个方法都是由Swing API提供给Java开发者,以便从当前线程更新GUI组件,而不是从事件发送线程。InvokeAndWait()同步GUI组件,比如一个进度条,一旦进 度更新了,应 相应 地 改变 进度 栏 。如果多个线程跟踪进度,然后 invokeAndWait() 方法要求事件发送线程相应更新组件。invokeLater()方法以非同步的方式调用更新组件。

42Swing API中哪些方法是线程安全的?

问题还涉及摇摆和螺纹安全,虽然组件不是线程安全,但有方法可以由多线程安全调用,例如, repaint(), revalidate()。JTextComponent的setText()方法和JTextArea的insert()和 append()方法也是线程安全的。

43如何在Java中创建不可变对象?

问题似乎与多线性无关,但不变性有助于简化已经非常复杂的平行程序。不可改变的对象可以共享而不同步,在同时访问对象时减少同步成本。但Java没有 @Immutable注释,要创建不可变类,执行下列步骤: 通过构建方法对所有成员进行初始化, 不向变量提供设置方法, 并声明现有成员私有,这不允许直接访问这些成员,在获取方法中,不要直接返回对象,而是克隆对象,并返回对象的拷贝。

在Java中什么是ReadWriteLock?

一般而言,读写锁定是锁隔技术的结果,它被用于提高同时程序的性能。Java中的ReadWriteLock是一个Java5的附加接口。ReadWriteLock维护了一对关联锁,一个用于读取操作,另一个用于写字。一个读锁可以被多个读线程同时保持,而无需编写一个线程。写锁是独占的,您可以在JDK中使用ReentrantReadWriteLock来实现这个规则,它支持到65535的写锁和65535的读锁。

一个多于45个线程的繁忙循环是什么?

一个繁忙的循环是当程序员使用一个循环等待一个线程时。与传统的方法不同, wait(), sleep()或 yield(),它们都放弃CPU控制。一个繁忙的周期不会放弃CPU,它只是运行一个空的循环。其目的是保存CPU缓存,在多核系统中,当一个等待线程醒来时,它可以在另一个内核中运行。这样会重建缓存。它可以用于避免重构缓存,并减少重构的等待时间。

46变量与原子变量之间有什么区别?

这是个有趣的问题。首先,挥发性变量和原子变量看起来非常相似,但功能却不一样。随机变量可以保证优先,也就是说,写操作发生在随后的读操作之前,但它并不保证原子主义。例如,如果计数变量是可变的,那么计数++操作不是原子。AtomicInteger 类提供的原子方法可以使这些操作原子化,例如 getAndIncrement() 方法,它将当前值添加到原子加法操作中。其他数据类型和参考变量也可以执行类似的操作。

如果同步块中的线程抛出一个异常,会发生什么事?

这个问题使许多Java程序员陷入困境,如果你能想一下锁是否释放这个答案的线索,有几个有希望的答案。你的同步块是否正常或异常退出,里面的线程将释放锁,所以与锁接口相比,我更喜欢同步块,因为释放锁不需要我的力量,该函数可以在最后块释放锁中实现.

48例模式中的双重检索锁是什么?

这个问题经常在Java面试中提出,但是面试官只有50%的人对答案满意。一半的人无法写双重检查锁,一半的人无法说明它的漏洞和Java1如何修复。这实际上是创建一个线程安全的例子的旧方法,当实例第一次创建时,它试图通过单个锁定优化性能,然而,在JDK1.中它失败的太复杂了,我个人也不喜欢它。无论如何,即使你不喜欢它,你需要理解它。因为它经常被问到。

49如何在Java中创建一个安全的单元?

这是上述问题的后续行动,如果你不喜欢 double-checking locks,并且面试官要求创造单元课的另一种方法,您可以使用JVM的类加载和静态变量初始化功能来创建单元实例,或者使用排列类型创建单元,我喜欢它的工作方式。

如何强迫一个线程开始?

这个问题就像如何强迫雅华垃圾回收,我目前一点也不知道,虽然你可以使用System.gc()来进行垃圾回收,但是不保证能成功。在Java中无法强制一个线程启动,它由线程调度器控制,Java不发布相关API。
在Java程序中,等待和睡眠会引起某种停顿,它们可以满足不同的需要。等待()方法用于在线程之间进行通信。如果等待条件是正确的,其他线程被唤醒,它释放锁,sleep()方法简单地释放CPU资源或暂时停止当前线程运行,但不会释放锁。


Copyright © 2012-2014 Www.tudoupe.Com. 土豆启动 版权所有 意见建议:tdsky@tudoupe.com

土豆系统,土豆PE,win7系统下载,win7 64位旗舰版下载,u盘启动,u盘装系统,win10下载,win10正式版下载,win10 RTM正式版下载,win8下载,电脑蓝屏,IE11修复,网络受限,4K对齐,双系统,隐藏分区,系统安装不了,U盘装系统,笔记本装系统,台式机装系统,diskgenius运用,GHSOT装系统,U盘修复,U盘技巧,U盘速度,U盘不能格式化,U盘复制发生错误,U盘加密,U盘选购,开机黑屏,蓝屏,进不了系统,上不了网,打不开程序,点击无反应,系统设置,PE个性化,PE添加网络,PE维护系统

点击这里给我发消息