共计 2275 个字符,预计需要花费 6 分钟才能阅读完成。
开篇介绍
大家好,公众号【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 准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!