天总结出来的是Java线程相关类的面试题。把参考答案和解析也发布出来,供大家学习参考。

1.线程是什么?进程是什么?二者有什么区别和联系?

(1)线程是CPU独立运行和独立调度的基本单位;

(2)进程是资源分配的基本单位;是执行着的应用程序

两者的联系:进程和线程都是操作系统所运行的程序运行的基本单元。

区别:

(1)进程具有独立的空间地址,一个进程崩溃后,在保护模式下不会对其它进程产生影响。

(2)线程只是一个进程的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。

进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。

2、线程和进程各自有什么区别和优劣呢?

进程是资源分配的最小单位,线程是程序执行的最小单位。

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

3、创建线程有几种不同的方式?你喜欢哪一种?为什么?

有三种方式可以用来创建线程:

继承Thread类

实现Runnable接口

应用程序可以使用Executor框架来创建线程池

实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

4、概括的解释下线程的几种可用状态。

线程在执行过程中,可以处于下面几种状态:

就绪(Runnable):线程准备运行,不一定立马就能开始执行。

运行中(Running):进程正在执行线程的代码。

等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

睡眠中(Sleeping):线程被强制睡眠。

I/O阻塞(Blocked on I/O):等待I/O操作完成。

同步阻塞(Blocked on Synchronization):等待获取锁。

死亡(Dead):线程完成了执行。

推荐一个交流学习群,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

点击:加入

5、同步方法和同步代码块的区别是什么?

在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

(1)、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

(2)、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

(3)、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

(4)、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

(5)、以上规则对其它对象锁同样适用。

6、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

7、什么是死锁(deadlock)?

两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。

8、如何确保N个线程可以访问N个资源同时又不导致死锁?

使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

9、如何避免死锁?

多线程产生死锁的四个必要条件:

互斥条件:一个资源每次只能被一个进程使用。

保持和请求条件:一个进程因请求资源而阻塞时,对已获得资源保持不放。

不可剥夺调教:进程已获得资源,在未使用完成前,不能被剥夺。

循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

只要破坏其中任意一个条件,就可以避免死锁,其中最简单的就是破环循环等待条件。按同一顺序访问对象,加载锁,释放锁。

以上就是Java线程类常见的面试题和答案,Java线程也是面试必考的重点内容。

推荐一个交流学习群,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

点击:加入

java中的线程方面的面试题_Java线程类相关面试题与答案总结相关推荐

  1. Java中的“可运行的实现”与“扩展线程”

    从什么时候开始在Java中使用线程开始,我发现了以下两种编写线程的方法: 与implements Runnable : public class MyRunnable implements Runna ...

  2. 线程 sleep 取消_Java面试集锦:25道线程类相关面试题与答案(下)

    26. 并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对 ...

  3. java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定

    java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定 2016年05月11日 11:20:08 阅读数:6336 一. 计算机的小数计算一定范围内精确,超过范围只能 ...

  4. Android性能优化面试题,与性能优化相关面试题 - 与IPC机制相关面试题 - 《Android面试宝典》 - 书栈网 · BookStack...

    源码分析相关面试题 Activity相关面试题 与XMPP相关面试题 与性能优化相关面试题 与登录相关面试题 与开发相关面试题 与人事相关面试题 与人事相关面试题现在三四月份,金三银四最好找工作时间, ...

  5. java线程试题_java线程面试题及答案

    1)2017Java面试题及答案:什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务 ...

  6. Java中如何使用Thread和Runnable创建的线程

    前言 我们都知道通过继承Thread和实现Runnable接口都能创建线程,那么他们有什么区别呢? 继承Thread创建线程 通过extends关键字继承Thread然后覆盖其run方法就可以实现一个 ...

  7. java程序中怎么保证多线程的运行安全_Java线程安全问答(草稿)

    1.什么是线程安全? 如果一个类在多线程执行中,在不考虑运行环境的调度干预,也不需要调用代码的协调同步,仍然保证正确地运行,那么这个类就是线程安全的 也就是说,多线程环境下,线程安全的类总是有正确的行 ...

  8. Java中condition的用法_java5 Condition用法--实现线程间的通信

    Condition的功能类似在传统线程技术中的Object.wait()和Object.natify()的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干,Con ...

  9. java多线程按行读取文件_“java”中多线程按行读取txt且每个线程读的内容不能重复,这么求“demo”?...

    展开全部 你把原来程序中直接读的地62616964757a686964616fe4b893e5b19e31333365646234方,改成调用上面的函数,由该函数统一读行.这样,不管是你有 N 个线程 ...

  10. java线程池的面试题_java线程池 面试题(精简)

    什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理. 如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线 ...

最新文章

  1. 《Excel与VBA开发》一书上市时间
  2. BZOJ3945 : 无聊的邮递员
  3. Windows系统下首次安装深度学习框架Caffe失败
  4. Day16 os模块、time模块、random模、math模块
  5. 浅析Java线程池 ExecutorService
  6. 工作总结书写的意义及要求
  7. uibot和按键精灵区别_uibot和按键精灵哪个强大
  8. 软件架构乱弹——问题域及其解决方法
  9. LoRa是怎样实现定位的
  10. 禁止ipc$默认共享的方法
  11. struts2基础----自定义拦截器
  12. linux如何查icsci进程,linux13问
  13. php解析定时任务格式,php 实现定时任务简单实现
  14. Word文档打不开怎么办
  15. 敏捷开发之利刃—db4o
  16. 2022山东省安全员C证考试试题及答案
  17. 练习题《中心对称矩阵》
  18. 关于 WARN conf.Configuration: bad conf file: element not property
  19. LINODE优惠码与服务器搭建
  20. 在Eclipse MarketPlace网页中安装插件显示Eclipse:Drag to Install!

热门文章

  1. [2018.10.24 T3] 老大
  2. [2018.10.11 T3] 欠钱
  3. Luogu3613 睡觉困难综合征
  4. 小程序学习笔记(7)-使用小程序的组件构建UI界面
  5. 导入grafana的dashboards模板
  6. mysql查询季度数据统计_mysql按年度、季度、月度、周、日SQL统计查询代码
  7. mysql5.7.13编译安装_编译安装MySQL-5.7.13
  8. kerberos linux 账号,使用AD / Kerberos进行身份验证/授权的Linux服务器是否需要计算机帐户?...
  9. micropython教程nucleo-f767zi开发板_micropython移植到正点原子F767的問題
  10. showdoc修改json转表格格式