快捷搜索: 长连接 前端 源码 pan

java 多线程面试_这些Java多线程面试题,你都明白了吗?

1、进程、线程、并行及并发是什么?

进程:就是一个应用程序,相当于一个软件,如果杀掉一个进程,软件就终止了

线程:就是一个进程中的执行场景或一个执行单元,一个进程可以启动多个线程

并行:多个处理器或多核处理器同时处理多个任务

并发:多个任务在同一个CPU核上,按细分的时间片轮流执行

2、实现线程的常用二种方式

第一种:编写一类,直接继承Java.lang.Thread,重写run方法即可。

public class ThreadTest01 {public static void main(String[] args) {MyThread thread = new MyThread();//start()作用是:启动一个分支线程,在JVM中开辟一个新的栈空间,执行完,瞬间结束//这段代码任务是开启一个新的栈空间,只要新的栈空间开出来,start就结束,线程就启动成功//启动成功线程会调用run方法,且run方法分支栈的栈低部(压栈)//run方法在分支栈的栈底,和main是平级的thread.start();for (int i = 0; i < 1000000000; i++) {System.out.println("主线程--->" + i);}}}class MyThread extends Thread {@Overridepublic void run() {System.out.println("分支线程--->" + i);

第二种:编写一类,实现Java.lang.Runnable接口,实现run方法即可。

使用匿名内部类创建线程

注:实现Runnable和继承Thread区别

使用实现Runnable接口的方式更能体现面向对象的编程思想Runnable内部的代码可以被多个线程共享,适用于多个线程处理同一资源的情况如果继承Thread类,但是由于java单继承的特性,此类不可再继承其他类3、run()方法和start()方法的区别

run()方法不会启动线程,不会分配新的分支栈,是单线程的(用于执行线程的运行代码,可重复调用)

start()方法启动一个分支线程,在JVM中开辟一个新的栈空间,执行完,瞬间结束

4、线程生命周期

(1)新建状态:实例化线程的时候,也就是刚new出来的线程对象

(2)就绪状态:new出来的线程对象后,调用start方法后,当一个线程抢到CPU时间片之后,它就开始执行run方法,如果run方法开始执行就标示着线程进入运行状态。(就绪状态:表示当前线程具有抢夺CPU时间片的权利,抢到时间片才能有执行权)

(3)运行状态:run方法执行标示着这个线程进入运行状态,如当前CPU时间片用完啦,会重新回到就绪状态继续抢夺时间片,抢到时间片,再重新进入run方法接着上一次的代码继续 执行下去。

(4)死亡状态:线程的run()方法执行完毕。

(5)阻塞状态:当一个正在执行线程遇到某种情况下暂时放弃当前占有的CPU时间片,同时也是暂停执行,就进入阻塞状态。一旦线程苏醒后,会再次进入就绪状态继续抢夺CPU时间片。

5、如何获取线程对象和名字及修改(了解即可)

主要讲解如何获取线程对象,如何获取线程对象名字及如何修改线程对象的名字,代码如下。

6、多线程并发环境,如何确保数据安全问题

重点:项目运行在服务器中,而服务器已经帮我们将线程定义了,比如线程启动、线程蠢创建等都已经给我们实现啦。

7、什么时候存在线程安全问题?

满足以下三个条件,会存在线程安全:

多线程并发有共享数据共享数据有修改的行为8、解决线程安全问题

使用“线程同步机制”也就是线程必须排序执行,说到线程同步,我们来了解什么是“异步编程模型”和“同步编程模型”。异步编程模型其实就是多线程并发(效率高),可以理解为各自线程执行各自的,无不干扰,而同步编程模型就是线程排队(效率低 ),理解为t1线程执行时,必须等待t2线程执行结束才执行。

9、sleep()和wait()方法的区别?

(1)类的不同:sleep来自于Thread,而wait来自于object。

(2)释放锁:sleep不释放锁,而wait释放锁。

(3)用法不同:sleep时间到会自动恢复,wait可以用notify()或ontiftall直接唤醒。

注:notifyall()会唤醒所有线程,ontift唤醒一个线程。

1、进程、线程、并行及并发是什么? 进程:就是一个应用程序,相当于一个软件,如果杀掉一个进程,软件就终止了 线程:就是一个进程中的执行场景或一个执行单元,一个进程可以启动多个线程 并行:多个处理器或多核处理器同时处理多个任务 并发:多个任务在同一个CPU核上,按细分的时间片轮流执行 2、实现线程的常用二种方式 第一种:编写一类,直接继承Java.lang.Thread,重写run方法即可。 public class ThreadTest01 {public static void main(String[] args) {MyThread thread = new MyThread();//start()作用是:启动一个分支线程,在JVM中开辟一个新的栈空间,执行完,瞬间结束//这段代码任务是开启一个新的栈空间,只要新的栈空间开出来,start就结束,线程就启动成功//启动成功线程会调用run方法,且run方法分支栈的栈低部(压栈)//run方法在分支栈的栈底,和main是平级的thread.start();for (int i = 0; i < 1000000000; i++) {System.out.println("主线程--->" + i);}}}class MyThread extends Thread {@Overridepublic void run() {System.out.println("分支线程--->" + i); 第二种:编写一类,实现Java.lang.Runnable接口,实现run方法即可。 使用匿名内部类创建线程 注:实现Runnable和继承Thread区别 使用实现Runnable接口的方式更能体现面向对象的编程思想Runnable内部的代码可以被多个线程共享,适用于多个线程处理同一资源的情况如果继承Thread类,但是由于java单继承的特性,此类不可再继承其他类3、run()方法和start()方法的区别 run()方法不会启动线程,不会分配新的分支栈,是单线程的(用于执行线程的运行代码,可重复调用) start()方法启动一个分支线程,在JVM中开辟一个新的栈空间,执行完,瞬间结束 4、线程生命周期 (1)新建状态:实例化线程的时候,也就是刚new出来的线程对象 (2)就绪状态:new出来的线程对象后,调用start方法后,当一个线程抢到CPU时间片之后,它就开始执行run方法,如果run方法开始执行就标示着线程进入运行状态。(就绪状态:表示当前线程具有抢夺CPU时间片的权利,抢到时间片才能有执行权) (3)运行状态:run方法执行标示着这个线程进入运行状态,如当前CPU时间片用完啦,会重新回到就绪状态继续抢夺时间片,抢到时间片,再重新进入run方法接着上一次的代码继续 执行下去。 (4)死亡状态:线程的run()方法执行完毕。 (5)阻塞状态:当一个正在执行线程遇到某种情况下暂时放弃当前占有的CPU时间片,同时也是暂停执行,就进入阻塞状态。一旦线程苏醒后,会再次进入就绪状态继续抢夺CPU时间片。 5、如何获取线程对象和名字及修改(了解即可) 主要讲解如何获取线程对象,如何获取线程对象名字及如何修改线程对象的名字,代码如下。 6、多线程并发环境,如何确保数据安全问题 重点:项目运行在服务器中,而服务器已经帮我们将线程定义了,比如线程启动、线程蠢创建等都已经给我们实现啦。 7、什么时候存在线程安全问题? 满足以下三个条件,会存在线程安全: 多线程并发有共享数据共享数据有修改的行为8、解决线程安全问题 使用“线程同步机制”也就是线程必须排序执行,说到线程同步,我们来了解什么是“异步编程模型”和“同步编程模型”。异步编程模型其实就是多线程并发(效率高),可以理解为各自线程执行各自的,无不干扰,而同步编程模型就是线程排队(效率低 ),理解为t1线程执行时,必须等待t2线程执行结束才执行。 9、sleep()和wait()方法的区别? (1)类的不同:sleep来自于Thread,而wait来自于object。 (2)释放锁:sleep不释放锁,而wait释放锁。 (3)用法不同:sleep时间到会自动恢复,wait可以用notify()或ontiftall直接唤醒。 注:notifyall()会唤醒所有线程,ontift唤醒一个线程。
经验分享 程序员 微信小程序 职场和发展