java高级特性之多线程

北斗导航 | 2023 PTTI会议论文 2023 ITM会议论文 2022 ION GNSS+ 会议论文下载:ION 美国导航学会 2023 国际技术会议(ITM) 2023 精密时间和时间间隔系统和应用会议(PTTI) 2022 美国导航学会国际会议(ION GNSS +) 阅读详情
java多线程知识点:

1、创建分线程的方式

2、单例模式懒汉式线程安全问题

3、java线程同步

4、java线程通信

5、java的内存模型

认识线程:

每一个java程序都有一个隐含的主线程,即main()方法。

程序–>进程 —>线程 理解

何时需要多线程操作:

1,程序需要执行多个任务的时候。

2,程序需要实现一个等待的任务时,如等待用户输入,文件读写,网络操作,搜索等。

3,程序需要后台运行的程序时。

创建分线程的方式:

1,继承Thread类,其子类重写Thread类的run()方法即可。

    每一个线程都是通过Thread类的run()方法来完成相应的功能,经常把run()方法的主体称为 线程体。

    通过子类对象的start()方法来执行当前线程。start()方法的两个作用:①启动当前线程 ②执行线程的run()方法。

2,创建实现Runnable接口的类,并且实现接口中的抽象run()方法。

实例化一个Rundnable接口实现类的对象,并将此对象作为参数传递给Thread类的构造器。

通过Thread类对象调用strar()方法执行当前线程。
多线程认识:JVM负责管理这些线程,这些线程将被轮流执行。使得每一个线程都有机会使用CPU资源。

两种分线程创建的联系和区别:

1,public static Thread implements Runnable
{Thread 类的本质如上实现了Runnable 接口}

2,第二种分线程创建的方式如下优点:

①没有单继承的局限

②若多线程有共享数据的话,实现更加方便。

使用Thread子类创建线程的优点:
可以在子类中增加新的成员变量,使得线程具有某种属性,也可以在子类中新增加方法,使线程具有某种功能。但是java不支持多继承,Thread类的子类不能再拓展其他类。

线程中的常用方法:
 * 1.start():开启线程;执行相应的run()

 * 2.run():分线程要执行的功能封装在run()中

 * 3.currentThread():获取当前正在执行的线程

 * 4.getName():获取当前线程的名字

 * 5.setName():设置当前线程的名字

 * 6.yield():暂时释放线程对当前cpu的占用

 * 7.join():在线程a中调用线程b.join()表示:当前线程a进入阻塞状态,线程b开始执行,直到线程b执行结束,线程a才继续执行。

 * 8.sleep(long millitimes):显示的使得当前线程睡眠指定的毫秒数。这个过程中,当前线程处于阻塞状态

 * 9.isAlive():当前线程是否还存活

 *

 * 10.线程的优先级:getPriority() / setPriority(int i)

 *   MIN_PRIORITY:1

 *   NORM_PRIORITY:5

 *   MAX_PRIORITY:10

 *   优先级高,并不是当前线程被首先执行完,而是被执行的概率大

 * 11.线程的通信: wait() / notify()  / notifyAll()

单例模式-懒汉式线程安全及高效率的问题


public Bank getInstance() {

if (bank == null) {

     synchronized (this) {

          if (bank == null) {

               bank = new Bank();

                                        }
               }
         }

 return bank;

}

线程的生命周期:

线程的生命周期图

线程的同步机制:解决线程的安全问题

出现线程安全问题的原因:

当一个线程在操作共享数据的过程中,还没有执行结束,另外的线程就参与进来,同样的去操作共享数据,就导致了出现了线程安全的问题

如何解决:

必须让一个线程完整的操作完共享数据之后,其他的线程才可以参与进来,继续操作共享数据。

java同步机制

同步代码块:

synchronized(同步监视器){

 //需要被同步的代码

   }

同步方法:

public synchronized void show(){

//方法体

}

除了synchronized关键字之外,还可以定义一个可重入锁的变量

private ReentrantLock lock = new ReentrantLock();

lock.clock()

try{

//需要被同步的代码块

}finally{

lock.unlock()}

从Java 5开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。 Lock是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象。 在实现线程安全的控制中,比较常用的是ReentrantLock(可重入锁),可以显式加锁、释放锁。

说明:

     1.需要被同步的代码,即为操作共享数据的代码

     2.共享数据:多个线程共同操作的变量。

     3.同步监视器,俗称锁。哪个线程获取了锁,哪个线程就执行大括号中需要被执行的代码。其它的线程在外面等待。

共享数据的访问权限必须是private,以保证当前线程访问数据的时候,工作主内存空间的线程不能访问和操作数据。

 >任何一个类的对象都能充当锁

 >保证线程的安全,需要所有的线程共用同一把锁!,(优先考虑this)

释放锁的操作:

1、当前线程的同步方法、同步代码块执行结束
2、当前线程在同步代码块、同步方法中遇到break、return终止了该代码块、该方法的继续执行。
3、当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束
4、当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁。

不会释放锁的操作:

1、线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行。
2、线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器)。

应尽量避免使用suspend()和resume()来控制线程

线程通信

  • wait():一旦执行到此方法,就使得当前线程进入阻塞状态。直到其他线程唤醒为止。

  • notify():一旦执行到此方法,就会唤醒其它被wait()的线程中优先级最高的一个。

  • notifyAll():一旦执行到此方法,就会唤醒其它所有被wait()的线程

  • 要求:
    1.如上的三个方法必须使用在同步方法或者同步代码块中。

  • 2.如上的三个方法的调用者必须是同步方法或者同步代码块的同步监视器!

Java.lang.Object提供的这三个方法只有在synchronized方法或synchronized代码块中才能使用,否则会报如下异常:

java.lang.IllegalMonitorStateException

在当前线程中调用方法:对象.wait()/wait() 功能,使当前线程进入等待(某对象)状态 ,直到另一线程对该对象发出 notify (或notifyAll) 为止。
调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁) 调用此方法后,当前线程将释放对象监控权 ,然后进入等待 在当前线程被notify后,要重新获得监控权,然后从断点处继续代码的执行。

在当前线程中调用方法:对象名.notify() 功能,唤醒等待该对象监控权的一个线程。
调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁)

死锁:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁

ET2012新版免狗免安装绿色软件 ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉, 立即下载

相关推荐

LTspice基础教程-009.LTspice波形测量

<<==上一篇:LTspice基础教程-008.LTspice PWL设置 >>==下一篇:LTspice基础教程-010. 首篇博客文末提供所有相关资源百度网盘分享链接

gaoyong_wang的博客 4万+

黑马程序员 java中的多线程

多线程 Java中实现多线程有两种方法: 1、继承Thread类,覆盖run()方法:使用Thread子类创建线程的优点是可以在子类中增加新的成员变量或方法,使线程具有某种属性或功能。但Java不支持多继承,Thread类的子类不能再扩展其他的类。 方法一:继承Thread类,覆盖方法run(); 我们在创建的Thread类的子类中重写run(),加入线程所要执行的代码即可 Age一:

sunshuai686的专栏 370

微信小程序导航栏滑动一定距离后固定到顶部

接上一篇文章的内容,通常在一个页面中部会有一个导航栏查看不同的内容,这篇文章旨在实现在页面下滑的过程中导航栏自动固定到顶部以便我们阅读过程中的切换。 下滑一段距离后自动固定到顶部 首先,思考这个功能应该是怎么实现的: 在页面下滑的过程中,我们希望系统应当能识别下滑了多少距离,当原本的导航栏逐渐被遮住以后(遮住意味着下滑了特定距离),触发这个功能,执行另一种样式,将导航栏固定在页面顶端,同时如果我们将页面往上滑,系统能识别到原来的导航栏能露出来了(即距离顶端的高度小于一个特定的值),这时候又执行最初的样式

Oblivision_Geek的博客 4032

Java:Java判断题--考试备考

Java考试常考判断题。Java判断题。

是蟹老板的博客 3405

TCGA数据下载保姆级教程:用GDC-client从零搞定,附配置文件避坑指南

本文提供TCGA数据下载的完整教程,详细讲解如何使用GDC-client工具从零开始配置到高效获取基因组数据。涵盖环境准备、认证配置、数据检索、高效下载及故障处理等关键步骤,并附配置文件避坑指南,帮助生物医学研究者快速掌握TCGA数据下载技巧。

weixin_30892037的博客 262

OpenBCI脑电数据处理实战:用MNE库从Raw对象到可视化分析全流程

本文提供了使用MNE-Python库处理OpenBCI脑电数据的完整实战指南。从通过BrainFlow库获取原始数据流、创建核心的Raw对象,到进行工频滤波、带通滤波等关键预处理步骤,最后实现时域信号、功率谱密度及地形图等多种专业可视化分析,手把手教你完成脑机接口数据处理的全流程。

gin88的博客 369

Java高级特性

高级特性全篇

rhw200617的博客 1230

LabVIEW与VisionMaster融合开发:从封装避坑到高效集成的实战指南

本文为LabVIEW开发者提供了一套与海康VisionMaster融合开发的实战指南。针对直接调用SDK时遇到的程序集加载失败和面向对象编程冲突等核心障碍,文章详细介绍了通过C#进行“浅封装”的解决方案,包括封装显示控件和核心功能类,并给出了在LabVIEW中高效集成、调用及资源管理的最佳实践,旨在帮助开发者稳定、高效地集成机器视觉功能。

weixin_29210727的博客 154

JAVA多线程详解(超详细)

线程简介,线程的创建方式,多线程并发问题

七星太极阵的博客 2万+

1分钟吃透一篇文献,借助AI辅助各部分精读,效率提升10倍(附AI提示词)

你现在是一名【研究领域】的资深博士,非常擅长阅读与分析长篇论文,那么接下来我会给你上传一篇论文,请你按照我的要求辅助我阅读。

qq_64378896的博客 641

手把手入门YOLO到改进优化教程专栏介绍与说明——列表目录查阅(持续更新)

手把手入门YOLO到改进优化教程专栏介绍与说明——列表目录查阅(持续更新)

嵌入式阿齐Archie 2万+

java多线程(超详细)

进程就是正在运行中的程序(进程是驻留在内存中的)是系统执行资源分配和调度的独立单位每一进程都有属于自己的存储空间和系统资源注意:进程A和进程B的内存独立不共享。

zdl66的博客 10万+

摆脱英文束缚!群晖Transmission4.0.4全新中文界面攻略

在群晖安装完官方Transmission4.0.4套件后,界面是英文状态的,不太好用。但是按照网上分享的原来4.0以前版本的方法更新UI又失败,所以自己搞了下成功了,分享给需要的朋友。

XiaoqiangClub的博客 5215

头歌实训代码 Java面向对象 高级特性 多线程

【代码、答案】头歌作业,面向对象、高级特性(集合框架、IO流)、多线程

HL031125的博客 2313

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java高级特性之多线程

1)文笔有限,如若有对该博客不清楚的地方可以私信作者或者在底下评论,我一定会第一时间回复。码字不易,干货连连,有兴趣的小伙伴点个赞呗,大家相互学习。 目录索引1 基本概念1.1 程序、进程与线程1.2 内存结构中进程与线程的关系1.3 线程的生命周期1.4 并行与并发1.5 多线程的使用场景2 创建多线程的四种方法3 实现Runnable接口3.1 利用Runnable实现基础实现(无线程同步)3.2 利用Runnable实现线程同步(synchronized同步代码块)3.3 利用Runnable实现.

weixin_44262126的博客 500

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java高级特性与实战项目 ——第四章: 多线程

1.编写一个程序,创建俩个线程对象,每个线程输出1~5的数。要求线程类分别使用继承Thread类和实现Runnable接口俩种方式创建。public class MyThread1 extends Thread{ //继承 @Override public void run() { //重写方法 // TODO Auto-generated method stub for (in...

gz98411的博客 760

EduCoder实训答案-Java高级特性- 多线程练习题

简介 其他各类实训答案的目录见这里 答案查询的入口网页版 答案获取的方法简介见这里 并不是所有的关卡都有答案,有些只有部分关卡有 Java高级特性 - 多线程练习题 >>>查看 第1关:顺序输出 第2关:售票窗口 [外链图片转存中…(img-Srq0Ue8Z-1598118072978)] ...

weixin_44505587的博客 644

Java高级特性增强-多线程

请戳GitHub原文: https://github.com/wangzhiwub... 大数据成神之路系列: 请戳GitHub原文: https://github.com/wangzhiwub... Java高级特性增强-集合 Java高级特性增强-多线程 Java高级特性增强-Synchronized Java高级特性增强-vola...

weixin_33901926的博客 103

Java高级特性:多线程

多线程 主线程 线程的创建和启动 1、继承Thread类创建线程 2、实现Runnable接口创建线程 线程状态 1、线程优先级 2、线程休眠 3、线程的强制运行 4、线程的礼让 多线程共享数据引发的问题 Hashtable 与HashMap的区别...

qi341500的博客 374

Java多线程编程基础与高级特性

在现代软件开发中,多线程编程是一个重要的概念,它能够充分利用多核处理器的能力,提高程序的执行效率。Java 语言内置了对多线程的支持,使得开发者可以方便地创建和管理线程。

b123321888的博客 1260

java-高级特性 多线程

继承thread类实现多线程 package com.bxy.thread; class MyThread extends Thread{ private String title; public MyThread(String title) { this.title=title; } public void run() { System.out.println("线程启动"); ...

dreamMRs的博客 425

Java-高级特性-多线程

多线程 线程介绍 任务 进程 (Process ) 一个进程里可以有多个线程,如视频中同是听到声音,看图像,看弹幕,等等 线程 (Thread) Process与Thread Process:程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念 Thread:线程则是执行程序的一次执行过程,他是一个动态的概念。是系统资源分配的单位 通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的单位 多

哆啦A梦 454

Java高级特性多线程练习

进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 例一: 需求说明:张三和妻子各拥有一张银行卡和...

云祁QI 1944
上一篇: java高级特性之多线程 线程池
下一篇: java高级特性之泛型
昭zzz
博客等级 码龄16年 12粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值