当前位置:首页 > Java技术 > Java中多线程及并发常见问题

Java中多线程及并发常见问题

2022年11月09日 19:22:32Java技术6

目录

一、线程与进程的区别

分析:

总结:

Java中进程和线程的关系

二、Thread中start和run方法的区别

分析:

总结:

三、Thread和Runnable的区别

四、如何实现处理线程的返回值

如何给run()方法传参:

如何实现处理线程返回值:

五、Java线程的六种状态

六、sleep和wait的区别

七、notify和notifyall的区别

八、yield函数

九、interrupt函数

十、总结


一、线程与进程的区别

分析:

进程是资源分配的最小单位,线程是CPU调度的最小单位。

  • 进程是资源调度的最小单位,所有与进程相关的资源,都被记录在进程控制块PCB中

Java中多线程及并发常见问题 _ JavaClub全栈架构师技术笔记

  • 进程是抢占处理机的调度单位,它拥有一个完整的虚拟内存地址空间,进程发生调度时,不同进程拥有不同虚拟地址空间,同一进程内的不同线程共享同一地址空间。线程与资源分配无关,它属于某个进程,共享其资源。
  • 线程只由堆栈寄存器程序计数器线程控制块TCB组成

Java中多线程及并发常见问题 _ JavaClub全栈架构师技术笔记

 

总结:

Java中多线程及并发常见问题 _ JavaClub全栈架构师技术笔记

 

Java中进程和线程的关系

Java中多线程及并发常见问题 _ JavaClub全栈架构师技术笔记

 

二、Thread中start和run方法的区别

分析:

start方法源码中有一个start0方法,是一个native方法,可在openjdk网站中查看。start0中又调用了JVM的StartThread方法,该方法会创建一个新的线程,并调用run方法。

总结:

  • start方法会创建一个新的子线程并启动
  • run方法只是Thread的一个普通方法调用,还是在主线程中执行

 

三、Thread和Runnable的区别

  • Thread是一个实现了Runnable接口的类,Runnable接口中只有一个抽象的run方法。Thread通过start给Runnable的run方法实现了多线程。
  • 因Java单一继承,推荐使用Runnable。

 

四、如何实现处理线程的返回值

如何给run()方法传参:

  • 构造函数传参
  • 成员变量传参
  • 回调函数传参

如何实现处理线程返回值:

1.主线程等待法,让主线程循环等待,直到子线程返回值为止。

while(xxxx){
Thread.currentThread.sleep(100);
}

优点是实现简单,缺点是需要自己实现循环等待的逻辑,且无法精准控制(等待多久不确定)

 

2.使用Thread类的join方法阻塞当前线程以等待子线程处理完毕。

优点:实现更简单,控制更精准,缺点是力度不够细。

 

3.通过Callable接口实现:通过Future Task或者线程池获取

 

五、Java线程的六种状态

Thread类中有一个枚举类型state,其中包括六种:

1.新建(New):创建后尚未启动的状态

2.运行(Runnable):包含操作系统线程状态的Running和Ready

3.无限期等待(Waiting):不会被分配CPU时间,需要被显式唤醒

  • 没有设置Timeout参数的Object.wait()方法
  • 没有设置Timeout参数的Thread.join()方法
  • LockSupport.park()方法

4.限期等待(Timed Waiting):也不会被分配CPU时间,但一定时间后会被系统自动唤醒

  • Thread.sleep()方法
  • 设置Timeout参数的Object.wait()方法
  • 设置Timeout参数的Thread.join()方法
  • LockSupport.parkNanos()方法(需要传时间参数)
  • LockSupport.parkUntil()方法(需要传时间参数)

5.阻塞(Blocked):等待获取排它锁

6.结束(Terminated):已终止线程的状态

 

六、sleep和wait的区别

基本差别:

  • sleep是Thread类的方法,wait是Object类中的方法。
  • sleep可以在任何地方使用,wait只能在synchronize方法或synchronize块中使用

最主要的本质差别:

sleep只会让出CPU,不会改变锁行为

wait不只让出CPU,还释放已经占用的同步资源锁

 

七、notify和notifyall的区别

两个概念:锁池EntryList,等待池WaitSet

Java中多线程及并发常见问题 _ JavaClub全栈架构师技术笔记

Java中多线程及并发常见问题 _ JavaClub全栈架构师技术笔记

区别:

Java中多线程及并发常见问题 _ JavaClub全栈架构师技术笔记

 

八、yield函数

作用:暗示调度器自己愿意让出CPU,但结果取决于调度器。

 

九、interrupt函数

如何中断线程:

(已经被抛弃的方法:stop。太暴力、不安全。类似的还有suspend和resume方法)

 

目前使用的方法是interrupt,也是一种暗示,通知线程应该被中断,如何处理由被通知的线程自己处理。

①如果线程处于被阻塞状态,那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。

②如果线程处于正常活动状态,那么会将该线程的中断标志设置为true。被设置中断标志的线程将继续正常运行,不受影响。

③在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程。

 

十、总结

Java中多线程及并发常见问题 _ JavaClub全栈架构师技术笔记

 

 

 

 

 

 

 

 

作者:孙宏宇51
来源链接:https://blog.csdn.net/Sunhongyu51/article/details/105592418

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/69078.html

分享给朋友:

“Java中多线程及并发常见问题” 的相关文章

Java空指针异常解决java.lang.NullPointerException解决心得

Java空指针异常解决java.lang.NullPointerException解决心得

今天做课设的时候运行程序报出以下错误 java.lang.NullPointerException 首先要理解的是此错误并不会在 程序中报错,只会在运行的时候报错。 是由于某个参数(集合,数组等数据)可能出现一个null值而导致后面的程序不能运行时...

java基础知识讲解(一)数据类型和运算符

java基础知识讲解(一)数据类型和运算符

Java是一种强类型语言,每个变量都必须声明其数据类型。 Java的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。 Java中定义了3类8种基本数据类型 数值型- b...

Java虚拟机1:什么是Java

Java虚拟机1:什么是Java

前言 让我们来看一下Java的广告词,来自http://www.java.com/zh_CN/about/: 97%的企业桌面运行Java 美国有89%的桌面(或计算机)运行Java 全球有900万Java开发人员 开发人员的头号选择...

Java打印车票主要学习Java的比较语句

直接上代码 public static void main(String[] args) { // TODO Auto-generated method stub //初始化 Scanner in=new Scanner(S...

编写高质量代码改善java程序的151个建议——[52

编写高质量代码改善java程序的151个建议——[52

原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks Although the world is full of...

实现一个Java五子棋

实现一个Java五子棋

五子棋手把手教你写: 写在前面的话: 回想起从前初学代码的五子棋简直写的不像样子。今天闲来无事就写了个五子棋的小程序。 如果有需要可以从github上下载:github地址:https://github.com/GodofOrange/gobang.git 一来...

JAVA面试精选【Java基础第一部分】

  这个系列面试题主要目的是帮助你拿轻松到offer,同时还能开个好价钱。只要能够搞明白这个系列的绝大多数题目,在面试过程中,你就能轻轻松松的把面试官给忽悠了。对于那些正打算找工作JAVA软件开发工作的童鞋们来说,当你看到这份题目的时候,你应该感动很幸运,因为,只要你把题目中...

java中的内存模型

java中的内存模型

概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓性的一面,有时候在开发Java同步和线程安全要求很严格的程序时,往往容易混淆的一个概念就是内存模型。究竟什么...

Java 并发编程:核心理论

Java 并发编程:核心理论

并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。本系列会从线程间协调的方式(wait、notify、notifyAll)、Synchron...

【java】浅谈java内部类

【java】浅谈java内部类

最近在阅读《java核心技术 卷1》,对java内部类的基础知识梳理总结了一下,写下这篇文章和大家交流 前言 说到java内部类,想必大家首先会想到比较常用的“匿名内部类”,但实际上,这只是内部类的其中一种使用方式而已。内部类的使用方式实际...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。