线程

什么是线程

线程是指程序在执行过程中,能够执行程序代码的一个执行单元。

线程和进程的区别

  • 线程:一段程序执行过程中的一个执行单元,各个线程之间共享程序的内存空间以及一些进程级的资源,各线程拥有自己的栈空间。
  • 进程:一段正在执行的程序,一个进程可以有多个线程。

什么是守护线程

  • Java 提供了两种线程:守护线程和用户线程。守护线程又被称为“服务进程”、“精灵线程”和“后台线程”。是程序运行时在后台提供一种通用服务的线程,这种线程并不属于程序中不可或缺的部分。通俗来讲,任何一个守护线程都是整个JVM中所有非守护线程的“保姆”。
  • 用户线程和守护线程几乎一样。唯一的不同之处在于,如果没有用户线程的话,程序会终止运行,并杀死所有守护线程。所有只要有用户线程在运行,程序就不会终止。
  • 守护线程一般具有较低的优先级。它并非只有JVM提供,用户可以设置自己的守护线程。将一个用户线程设置为守护线程的方法就是在调用start()方法起订线程之前调用对象setDaemon(true)方法,若将以上的参数设置为false,则表示该线程为用户线程。 当在一个守护线程中产生了其他的线程,则这些线程默认还是守护线程。要不过户线程也是。

多线程

为什么使用多线程

  • 多线程可以减少程序的响应等待时间。
  • 与进程相比,线程的创建切换开销更小。
  • 多CPU或多核计算机本身就具有执行能力,多线程可以充分利用计算机资源。
  • 多线程可以简化程序结构,使程序便于理解和维护。

java中如何实现多线程

  • 继承Thread类,重写run()方法。
  • 实现Runnable接口,并实现接口的run()方法。
  • 实现Callable类,重写call()方法,Callable接口与Runnable接口功能类似,但是提供了比Runnable更强大的功能。

    1. Callable可以在任务结束之后提供一个返回值。
    2. Callable 中 call()方法可以抛出异常。
    3. 运行Callable方法可以拿到一个Future对象,表示异步计算的结果,它提供了检查计算是否完成的方法。

多线程的同步方式有哪些

  1. Synchronized关键字: java中的每一个对象都有一个对象锁与之相关联,该锁表明对象在任何时候只允许被一个线程所拥有。当线程调用对象的一段Synchronized代码时,需要先获取这个对象的对象锁,然后去执行相应的代码,执行结束之后,释放锁。
  1. wait()和notify()方法:在Synchronized代码执行期间,线程可以调用wait()方法,释放对象锁进入等待状态,可以调用notify()方法或者notifyAll()方法通知正在等待的其他线程。notify()方法仅允许唤醒一个线程(等待队列中的第一个线程)并允许这个线程去获得锁,notifyAll() 方法唤醒所有等待这个对象的线程并允许它们去 竞争锁
  1. Lock:

    • lock()。以阻塞的方式获取锁,获取锁后立即返回。如果别的线程持有锁当前线程等待,直到获取锁之后返回。
    • tryLock()。以阻塞的方式尝试性的获取锁。只是尝试性的去获取锁,如果获取到锁,立即返回true。否则返回false。
    • tryLock(long timeout,TimeUnit unit).以非阻塞的方式尝试性的获取锁,如果获取到锁,返回true,否则等待参数中设置的时间,等待的过程中若是获取了锁,就返回true。若是等待超时,返回false。
    • lockInterruptibly()。如果获取锁立即返回,如果没有获取锁,当前线程处于休眠状态直到获取锁,或者当前线程被别的线程中断(收到InterruptedException异常) 【与lock()的区别是如果lock()方法获取不到锁,会一直处于阻塞状态,且会忽略interrupt()方法】

Synchronized与Lock 的区别

  • Synchronized可以加载方法上,也可以加在特定代码块上,括号中表示的是要锁的对象。
  • Lock 需要显式的指定起始位置和终止位置。
  • Synchronized是托管给JVM执行的,Lock是通过代码实现的。
  • Lock的实现类ReentrantLock相比于Synchronized多了投票锁、定时锁、等候和中断锁。在竞争不激烈的情况下,Synchronized性能优于ReentrantLock。但是在资源竞争很激烈的情况下,Synchronized的性能会下降的特别快,而ReentrantLock的性能基本保持不变。
  • 锁的机制不同,Synchronized获得锁和释放锁都在块结构中,当获取多个锁时必须以相反的顺序释放。并且是自动解锁,不会因为出了异常而导致锁没有被释放从而引发死锁。
  • Lock 需要开发人员手动的去释放,并且在finally块中释放,否则会引起死锁。
  • Lock中的tryLock()方法可以用非阻塞的方式去获取锁。

run() 和 start()的区别

  • start()是启动一个线程的方法,将一个线程改变为JVM可以执行的就绪状态。
  • run()是线程启动之后实际执行的方法。run()执行结束之后,线程终止。(若是单独调用run(),则将run()作为一个普通的方法执行,实际上还是在运行原线程)

sleep()和wait()的区别

  • sleep()和wait()都是使线程暂停执行一段时间的方法。
  • sleep()是Thread类的静态方法。是线程用来控制自身流程的,sleep()方法不会释放锁。
  • wait()是Object类的方法,用于线程的通信 (这个方法会使当前拥有这个该对象的锁的线程等待,直到有方法调用了notify()或notifyAll()方法【也可以设定时间自动唤醒】) wait()方法释放锁。
  • wait方法必须放在同步控制方法或者同步代码块中使用,而sleep()方法则可以放在任何地方使用。

终止线程的方法有哪些(stop()和suspend()的区别)

stop() 终止线程时,会释放已经锁定的所有监视资源。
suspend()容易造成死锁,调用suspend()不会释放锁

join()方法的作用是什么

在java中join()方法做作用是让调用该方法的线程在执行完run()方法后,再执行join()方法后面的代码。 简单来说就是将两个线程合并。(用于实现同步功能)。
具体来说可以使用线程A的join()方法来等待线程A结束,或者使用线程A的join(2000)方法来等到线程A结束,但是最多只等待2s。

Java多线程 常见问题整理的更多相关文章

  1. Java多线程知识整理

    多线程 1. 多线程基础 多线程状态转换图 普通方法介绍 yeild yeild,线程让步.是当前线程执行完后所有线程又统一回到同一起跑线.让自己或者其他线程运行,并不是单纯的让给其他线程. join ...

  2. Java多线程常见问题

    1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和 ...

  3. Java中实现多线程关键词整理

    Java中的Runable,Callable,Future,FutureTask,ExecutorService,Excetor,Excutors,ThreadPoolExcetor在这里对这些关键词 ...

  4. Java多线程面试题整理

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

  5. 53道java多线程面试题整理及答案(2018年)

    最近看到网上流传着,各种面试经验及面试题,往往都是一大堆技术题目贴上去,而没有答案. 为此我业余时间整理了Java多线程相关的53道常见面试题,及详细答案,你可以用它来好好准备面试.望各路大牛,发现不 ...

  6. Java面试题整理一(侧重多线程并发)

    1..是否可以在static环境中访问非static变量? 答:static变量在Java中是属于类的,它在所有的实例中的值是一样的.当类被Java虚拟机载入的时候,会对static变量进行初始化.如 ...

  7. Java多线程常用面试题(含答案,精心总结整理)

    现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 目的是检测你对”join”方法是否熟悉.这个多线程问题比较简单,可以用join方法实现. 核心: threa ...

  8. java多线程面试题整理及答案(2018年)

    1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完 ...

  9. java多线程面试题整理及回答

    1)现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多线程问题比 ...

随机推荐

  1. 2019 GDD TensorFlow

    https://www.tensorflow.org/ https://tensorflow.google.cn/     (中文站点) 现场PPT照片:    https://pan.baidu.c ...

  2. Java 学习大纲

    1.java基础 1.1 Collection和Map     (1)掌握Collection和Map的继承体系     (2)掌握ArrayList,LinkedList,Vector,Stack, ...

  3. yandex 图片自动下载

    yandex 图片自动下载命令行程序 一个在 yandex 上搜索图片并下载到本地的 node cli 程序. 使用帮助: $0 <搜索关键词> [-t=超时(默认 1000)] [-r ...

  4. phpspreadsheet 中文文档(八)读写文件+读取文件

    2019年10月11日14:09:40 配置设定 将PhpSpreadsheet文件包含在脚本中之后,但是在实例化Spreadsheet对象或加载工作簿文件之前,可以设置许多配置选项,这些配置选项将影 ...

  5. 为什么var可以重复声明

    总结自:https://blog.csdn.net/DurianPudding/article/details/87953939 一言以蔽之:编辑器会在作用域判断这是重名声明时,忽略var直接赋值 首 ...

  6. Centos7.3之K8S安装初体验

    容器是发展趋势,所以是时候从虚拟机中脱离出来,投入到容器化的怀抱中了. 曾经试过安装k8s,都没有成功,各种乱七八糟的报错,于是一拖再拖,这次总算发现一个可以快速部署的工具,终于安装成功了. 这个k8 ...

  7. element ui表格常用功能如:导出 新增 删除 多选 跨页多选 固定表头 多级表头 合并行列 等常见需求

    <template> <div class="table-cooperte"> <el-table :data="tableData&quo ...

  8. Grammar01 语法七要素之一_词类

    1 词类 1.1 词类表格 实词 名词 -> n. -> noun -> 给所有人和物命名的词. 动词 -> v. (vt. vi.) -> verb ( transit ...

  9. springboot底层原理简述

    1.maven 子父依赖关系,快速整合第三方框架 2.无配置文件 省略了web.xml,spring.xml,springmvc.xml.mybatis.xml. spring3.0以上提供注解,sp ...

  10. docker 学习总结

    Docker 是一个容器工具,提供虚拟环境.解决了软件的环境配置和依赖问题,让软件可以带环境和依赖的安装. Docker 将应用程序与该程序的依赖,打包在一个文件里面.运行这个文件,就会生成一个虚拟容 ...