开篇介绍
大家好,公众号【Java极客思维】近期会整顿一些Java高频面试题分享给小伙伴,也心愿看到的小伙伴在找工作过程中可能用失去!本章节次要针对Java一些多线程高频面试题进行分享。
Q1:
线程 和 过程有什么区别?
过程:
过程是程序运行资源分配的最小单位。过程外部有多个线程,会共享这个过程中的资源。
线程:
线程是CPU调度的最小单位。必须依赖过程而存在。
特点:
- 线程的划分尺度小于过程,这使得多线程领有高并发性;
- 过程在运行时各自内存单元互相独立,线程之间内存共享;
- 多线程开发能够领有更好的性能和用户体验。
(留神:多线程开发对于其余程序是不敌对的,占据大量CPU资源。)
Q2:
如何平安的终止线程?
了解中断:
线程天然终止:天然执行完 或 抛出未解决的异样。Java线程是合作式工作,而非抢占式工作;
stop()、resume()、suspend()三个办法曾经在后续的jdk版本已过期,不倡议应用;
- stop()办法:会导致线程不正确开释资源;
- suspend()办法:挂起,容易导致死锁;
三种中断形式:
- interrupt()办法:interrupt()办法中断一个线程,并不是强制敞开该线程,只是跟线程打声招呼,将线程的中断标记地位为true,线程是否中断,由线程自身决定;
- inInterrupted()办法:判断以后线程是否处于中断状态;
- static办法interrupted()办法:判断以后线程是否处于中断状态,并将中断标记地位为false;
(留神:办法里如果抛出InterruptedException,线程的中断标记位会被置为false,如果的确须要中断线程,则须要在catch外面再次调用interrupt()办法。)
Q3:
sleep() 和 wait() 有什么区别?
sleep()办法:
- Thread类中的静态方法;
- 当一个线程调用sleep()办法当前,不会开释同步资源锁,其余线程依然会期待资源锁的开释。
wait()办法:
- Object类提供的一个一般办法;
- 而且必须同步资源锁对象在同步代码块或者同步办法中调用。当调用wait()办法后,以后线程会立即开释掉同步锁资源。其余线程就有机会取得同步资源锁从而持续往下执行。
Q4:
notify() 和 notifyAll() 办法有什么区别?
尽量应该利用notifyAll()办法,如果用notify()办法的话,jvm会执行曾经退出期待线程栈外面的第一个线程,给咱们的一种感官就是随机的抉择了一条线程,如果该线程达到条件就正好执行那一条,其实这是一个误区,这只是jvm会抉择在线程栈外面的第一个线程来唤醒。因而用notify()办法的话,可能会造成信号失落的状况。
Q5:
调用yield()、sleep()、wait()、notify()等办法对锁有何影响?
- 线程在执行yield()当前,持有的锁是不会开释的;
- sleep()办法被调用当前,持有的锁是不会开释的;
- 调用办法之前,必须要先持有锁。调用了wait()办法当前,锁就会被开释,当wait办法返回的时候,线程会从新持有锁;
4. 调用办法之前,必须要先持有锁。调用notify()办法自身不会开释锁。
Q6:
创立多线程的形式有哪些?
形式一:继承Thread类
Thread实质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且启动线程的惟一办法就是通过Thread类的start()实例办法。start()办法是一个native办法,它将启动一个新线程,并执行run()办法。这种形式实现多线程很简略,通过本人的类间接extend Thread,并重写run()办法,,就能够启动新线程并执行自定义的run()办法。例如:继承Thread类实现多线程,并在适宜的中央启动线程。
public class MyThread extends Thread { public void run() { System.out.println("MyThread.run()"); }}MyThread myThread1 = new MyThread();MyThread myThread2 = new MyThread();myThread1.start();myThread2.start();
形式二:实现Runnable接口的形式实现多线程,并且实例化Thread,传入本人的Thread实例,调用run()办法
public class MyThread implements Runnable { public void run() { System.out.println("MyThread.run()"); }}MyThread myThread = new MyThread();Thread thread = new Thread(myThread);thread.start();
形式三:通过Callable 和 Future创立线程
class T implements Callable<String> { @Override public String call() throws Exception { return null; }}
今天,会介绍多线程一些深刻的常识,长按二维码关注我吧~
祝大家都能拿到心仪的offer!
点关注、不迷路
如果感觉文章不错,欢送关注、点赞、珍藏,你们的反对是我创作的能源,感激大家。
如果文章写的有问题,请不要悭吝,欢送留言指出,我会及时核查批改。
如果你还想更加深刻的理解我,能够微信搜寻「Java极客思维」进行关注。每天8:00准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!