访中,我们通常会遇到两个主题: java采集问题 和多线程面试问题。多线程是关于并发和线程的。这是很好的准备,所以不要离开这个话题。我们正在共享重要的java多线程面试问题和答案。
Q1。什么是线程?
线程是一个轻量级的子进程。线程类属于java.lang包.Threads有自己的stack.It是一种利用机器中可用的多个cpu的方式。例如,如果一个线程需要50毫秒的时间来完成任务,那么可以使用10个线程将该任务减少到5毫秒。
Q2 Thread和Process之间有什么区别?
一个进程可以有很多线程。线程可以执行进程的任何部分。Process的同一部分可以由多个线程执行。
进程有自己的地址,而Thread共享创建它的进程的地址空间。
线程在进程中有自己的堆栈,所有线程共享一个常见的系统资源,如堆内存。
Q3在java中实现Thread的方法是什么?
在java中实现Thread有两种方法。
1.通过在java中实现Runnable接口,然后从中创建Thread对象。
2.通过扩展Thread类。
Q4在Java中创建线程时实现Runnable和扩展Thread之间有什么区别?哪一个更好?
实施Runnable更好。
当我们实现Runnable接口时,我们可以扩展任何其他类,但是如果我们扩展了Thread类,我们不能扩展任何其他类,因为java不允许多重继承。
您可以在这里找到实现Runnable和扩展Thread之间的区别的详细答案 。
Q5线程的生命周期是什么?
当我们在java程序中创建一个Thread实例时,它的状态是新的。然后我们启动Thread,然后将状态更改为Runnable(准备运行但尚未运行)。执行Threads取决于ThreadScheduler。ThreadScheduler负责将CPU分配给Runnable线程池中的线程,并将其状态更改为Running.Waiting,Blocked和Dead是Thread的剩余状态。
所以总而言之 , 一个线程可以在的新的,可运行的,运行的,等待的,被阻止的和死的。
Q6在java中sleep和wait方法有什么区别?
Wait方法释放锁,而sleep方法不释放锁。
Wait方法属于java.lang.Object类,而sleep方法属于java.lang.Thread类。
你可以在java中找到wait和sleep方法之间的详细答案 。
Q7使用start()方法和run()方法启动线程有什么区别?
这个问题有点棘手,也可能会混淆你。答案是当你调用start()方法时,main方法在内部调用run()方法来启动新创建的Thread,所以run方法最终被新创建的Thread调用。
当你调用run()方法时,它调用在同一个线程中,当你调用start()方法时,不会启动新的线程。
Q8用户线程和守护进程线程有什么区别?
当我们在java程序中创建一个线程时,它被称为用户线程。如果一个线程启动,我们不能使用户线程守护线程。
守护进程线程是低优先级的线程,为用户线程提供后台支持。它向用户线程提供服务。从守护线程创建的子线程也是一个守护进程线程。
Q9如何在java中创建守护进程?
通过设置setDaemon(true),我们可以在java中创建一个守护进程线程。
Q10使用volatile关键字有什么意义?
当我们做一个变量volatile时,所有的线程直接从内存中读取它的值,而不是缓存它。这确保共享变量始终更新。
volatile是一个只能与变量一起使用的关键字。
Q11有可能两次启动一个线程吗?
不,没有可能启动一个线程两次。如果我们这样做,那么它会抛出异常。
Q12什么是同步?
同步是控制多个线程访问任何共享资源的功能。
同步的主要优点是
一个。以避免一致性问题
湾 避免线程干扰
Q13哪个更优选 - 同步块或同步方法?
同步块是更优选的方式,因为它在锁定对象时不锁定对象。同步方法将在类中停止多个同步块,即使它们与执行无关,并将其置于等待状态以获取对象上的锁定。
Q14睡眠与产量方法的差异和相似之处?
如果另一个线程中断休眠的线程,而yield方法不会引发中断的异常,Sleep方法会抛出中断的异常。
Thread.sleep()方法不会导致当前正在执行的线程放弃监视器,而yield方法放弃监视器。
你可以在java中找到sleep和yield方法的区别的详细解释 。
Q15什么是僵局?
死锁是两个线程正在等待释放资源所持有的锁的情况。例如
线程1:锁定资源A,等待资源B
线程2:锁定资源B,等待资源A
Q16写一个程序在java中创建一个死锁?
您可以在这里找到答案 在Java中创建一个死锁程序 。
Q17你应该采取什么措施来避免僵局?
1.锁定类的特定成员变量,而不是锁定整个类。
2.如果可能,尝试使用join()方法尝试使用join方法,尽管它可能会阻止我们充分利用多线程环境,因为线程将依次开始和结束,但它可以方便地避免死锁。
3.如果可能,尝试避免嵌套同步块。
Q18你如何理解Thread的优先级?
每个线程都有优先级。其值为int ,取值范围为 1〜10,其中1为最低优先级,10为优先级。
通常较高优先级线程在执行中获得较高优先级,但这取决于依赖于操作系统的ThreadScheduler实现。
我们可以指定线程的优先级,但不能保证较高优先级的线程在低优先级线程之前被执行。
Q19类锁和对象锁之间有什么区别?
线程可以通过输入synchronized方法来获取对象锁.Threads可以通过输入静态同步方法获取类的类对象的锁定。
类的多个对象可能存在,并且每个对象都有自己的锁。在类锁定中,类的多个对象可能存在,但总是有一个类的类对象锁可用。
Q20 Callable和Runnable有什么区别?
可调用throws检查异常,而Runnable不抛出检查异常。
Runnable的返回类型为void,它不返回任何值,而Callable可以返回Future对象。
您可以找到可调用和可运行的区别的详细说明 。
Q21时间片和抢占式调度有什么区别?
在抢占式调度中,执行较高优先级的任务,直到它进入等待或死状态或更高优先级的任务出现。在时间切片中,任务运行预定义的时间片段,然后重新进入就绪任务池。
Q22可以同步一个构造函数吗?
否,构造函数无法同步。
Q23 java中的种族条件是什么,我们如何解决?
当多个线程尝试在没有同步的情况下访问同一资源时会导致竞争条件。
我们可以通过使用同步块或同步方法来解决竞争条件。
Q24线程如何相互通信?
线程可以使用wait(),notify(),notifyAll()方法相互通信。
Q25为什么wait(),notify()和notifyAll()方法必须从同步上下文调用?
当一个线程在任何Object上调用wait()时,它必须在Object上具有将要离开的监视器,并进入等待状态,直到任何其他线程在此Object上调用notify()。类似地,当一个线程在任何Object上调用notify()时,它将使对象上的监视器等待,并且其他等待的线程可以获取对象上的监视器。因为所有这些线程都需要线程来拥有一个对象监视器,这只能通过同步来实现。这就是为什么必须从同步上下文中调用wait(),notify()和notifyAll()方法的原因。
Q26什么是Java中的ThreadLocal变量?
ThreadLocal可用于创建ThreadLocal变量。我们知道一个Object的所有线程都共享它的变量。如果变量不是线程安全的,那么我们可以使用同步。如果我们想避免同步,那么我们可以使用ThreadLocal变量。
每个线程都有自己的ThreadLocal变量,它们可以使用它的get()和set()方法来获取默认值或将其值本地更改为Thread。
Q27什么是Threadpool?
Threadpool管理工作线程池。有一个队列,其中任务正在等待执行。
Q28你能发现线程是否在对象上保持lock()?
holdLock(Object)方法可用于确定当前线程是否保持指定对象的监视器上的锁定。
如果线程持有指定对象的锁定或监视器,则“保持”(Object)的方法返回true。
网友评论