【java面试】线程篇

1.什么是线程?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

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

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

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

一共有三种方式:

1.继承Thread类

2.实现Runnable接口,重写run方法

2.实现Callable接口,重写call方法(可以返回值和抛出异常)

  1. 用Runnable还是Thread?

在java中不支持多继承,支持多实现,如果该类需要继承其它类,则选择Runnable;

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

start()方法被用来启动新创建的线程,使进程就绪状态,而run()方法 ,执行线程,使线程进入运行状态。

6.线程的几种状态

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于"可运行线程池"中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

阻塞的情况分三种:

(1)、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入"等待池"中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,

(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入"锁池"中。

(3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

7.线程同步的几种方法

1.synchronized关键字修饰语句块或者修饰方法

2.volatile关键字修饰变量

3.使用重入锁Lock

ReentrantLock类是可重入、互斥、实现了Lock接口的锁,

它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力

ReenreantLock类的常用方法有:

ReentrantLock() : 创建一个ReentrantLock实例

lock() : 获得锁

unlock() : 释放锁

注:ReentrantLock()还有一个可以创建公平锁的构造方法,但由于能大幅度降低程序运行效率,不推荐使用

4.使用线程本地变量 ThreadLocal

5.使用阻塞队列实现线程同步(java.util.concurrent包中提供的类)

8.volatile与synchronized的区别

1)volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.

2)volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.

3)volatile仅能实现变量的修改可见性,而synchronized则可以保证变量的修改可见性和原子性.

4)volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.

9.终止线程的3中方式

1.线程正常执行完毕,正常退出。

2.使用while()循环在特定条件下退出。

3.使用interrupt方法终止线程。

10.什么是线程池? 为什么要使用它?

创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。线程池使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务。线程池主要作用是便于管理线程,节约时间与资源。

11.线程死锁

两个或两个以上的线程争夺共享资源,并各自不释放手中的资源,而造成死锁。

解决办法:1.让所有的线程按照一定的顺序获得一组锁;2.将多个锁组成一组并放到一个锁里。

12.sleep()和wait()的区别

sleep()使线程暂停一段时间,占用CUP资源,没用释放锁

wait()使线程进入等待池中,释放CPU资源,释放锁

相关推荐
啊森要自信2 小时前
【QT】常⽤控件详解(四)常用显示类控件类 Label && LCDNumber && ProgressBar && Calendar Widget
开发语言·数据库·c++·qt·qt6.3
Simple_core3 小时前
qt贝塞尔曲线演示工具
开发语言·qt
好易学·数据结构3 小时前
可视化图解算法57:字符串的排列
数据结构·算法·leetcode·面试·笔试·回溯算法·牛客
sannianji3 小时前
qt 采用movetothread在应用程序gui关闭时如何正确退出。
开发语言·qt
kfepiza5 小时前
JavaScript将String转为base64 笔记250802
开发语言·javascript·笔记
Warren985 小时前
Vue2博客项目笔记(第一天)
java·开发语言·javascript·vue.js·windows·笔记·ecmascript
Charles Wesley5 小时前
11:java学习笔记:1D array(1维数组)
java·笔记·学习·eclipse
软件测试-阿涛5 小时前
【自动化测试】Python Selenium 自动化测试元素定位专业教程
开发语言·python·selenium·自动化
stillaliveQEJ6 小时前
【JavaEE】多线程(一)
java·java-ee
勇闯逆流河6 小时前
【C++】Stack and Queue and Functor
开发语言·c++