日期类--JUnit--多线程基础--互斥锁

简介: 日期类--JUnit--多线程基础--互斥锁

日期类

第一代日期类

第二代日期类

  1. 第二代日期类,主要就是Calendar类(日历)。
  2. public abstract class Calendar extends Object implements Serializable,CloneableComparableCalendar
  3. Calendar类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY OF MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法

第三代日期类

DateTimeFormatter 格式日期

DateTimeFormat dtf = DateTimeFormatter.ofPattern(格式);

String str = dtf.format(日期对象);

类似于Date

提供了一系列和Date类转换的方式Instant->Date:

Date date = Date.from(instant);Date->Instant:

Instant instant = date.tolnstant):

第三代日期类更多方法

LocalDateTime类

MonthDay类:检查重复事件

是否是闰年

增加日期的某个部分

使用plus方法测试增加时间的某个部分

使用minus方法测试查看一年前和一年后的日期

JUnit

为什么需要 JUnit

1.一个类有很多功能代码需要测试,为了测试,就需要写入到main方法中

2.如果有多个功能代码测试,就需要来回注销,切换很麻烦

3.如果可以直接运行一个方法,就方便很多,并且可以给出相关信息,就好了->Junit

基本介绍:

1.JUnit是一个Java语言的单元测试框架

2.多数Java的开发环境都已经集成了JUnit作为单元测试的工具

java 绘图坐标体系

下图说明了Java坐标系。坐标原点位于左上角,以像素为单位。

在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素

坐标体系-像素

1.绘图还必须要搞清一个非常重要的概念-像素一个像素等于多少厘米?

2.计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。像素是一个密度单位,而厘米是长度单位,两者无法比较

绘图原理

Component类提供了两个和绘图相关最重要的方法:

1.paint(Graphicsg)件外观

2.repaint()刷新件外。

当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件

在以下情况paint()将会被调用:

1.窗口最小化,再最大化

2.窗口的大小发生变化

3.repaint方法被调用

Graphics 类

  1. 画直线 drawLine(int x1,int y1,int x2,int y2)
  2. 画矩形边框 drawRect(int x, int y, int width, int height)
  3. 画椭圆边框 drawOval(int x, int y, int width, int height)
  4. 填充矩形 fillRect(int x, int y, int width, int height)
  5. 填充椭圆 fillOval(int x, int y, int width, int height)
  6. 图片 drawlmage(Image imp, int x, int y, .)
  7. 画字符串 drawString(String str, int x, int y)
  8. 设置画笔的字体 setFont(Font font)
  9. 设置画笔的颜色 setColor(Color c)

java 事件处理机制

基本说明

java事件处理是采取“委派事件模型"。当事件发生时,产生事件的对象,会把此"信息”传递给"事件的监听者"处理,这里所说的"信息"实际上就是java.awt.event事件类库里某个类所创建的对象,把它称为“事件的对象"。

示意图

多线程基础

线程相关概念

自己理解:为了完成特定的任务的一组指令的集合

进程

1.是指运行中的程序

2.进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:有它自身的产生、存在和消亡的过程

3.并发:同一个时刻,多个任务交替执行,造成一种“貌似同时”的错觉,简单的说,单核cpu实现的多任务就是并发。

4.并行:同一个时刻 多个任务同时执行。多核cpu可以实现并行。并发和并行可以切换

线程基本使用

创建线程的两种方式

  1. 继承Thread类,重写 run方法

start0() 是本地方法,是 JVM 调用, 底层是 c/c++实现 //真正实现多线程的效果是 start0(), 而不是 run

2.实现Runnable接口,重写 run方法

1.java是单继承的,在某些情况下一个类可能已经继承了某个父类,这时在用继承Thread类方法来创建线程显然不可能了。

2.java设计者们提供了另外一个方式创建线程,就是通过实现Runnable接口来创建线程’

Thread thread = new Thread(T) //因为接口不能直接调用得用类

thread.start();

线程如何理解

继承 Thread vs 实现 Runnable 的区别

1.从java的设计来看,通过继承Thread或者实现Runnable接口来创建线程本质上没有区别,从jdk帮助文档我们可以看到Thread类本身就实现了Runnable接口

2.实现Runnable接口方式更加适合多个线程共享一个资源的情况,并且避免了单继承的限制,建议使用Runnable

线程终止

基本说明

1.当线程完成任务后,会自动退出。

2.还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式

常用方法第一组

  1. setName  设置线程名称,使之与参数 name相同
  2. getName   返回该线程的名称
  3. start   使该线程开始执行; Java虚拟机底层调用该线程的 start0方法
  4. run  调用程对象run方法;
  5. setPriority     更改线程的优先级
  6. getPriority   获取线程的优先级
  7. sleep  在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
  8. interrupt 中断线程

注意事项和细节

  1. start底层会创建新的线程,调用run,run就是一个简单的方法调用,不会启动新线程
  2. 线程优先级的范围
  3. interrupt,中断线程,但并没有真正的结束线程。所以一般用于中断正在休眠线程
  4. sleep:线程的静态方法,使当前线程休眠

常用方法第二组

  1. yield:线程的礼让。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定礼让成功
  2. join:线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务

用户线程和守护线程

  1. 用户线程:也叫工作线程,当线程的任务执行完或通知方式结束
  2. 守护线程:一般是为工作线程服务的,当所有的用户线程结束,守护线程自动结束
  3. 常见的守护线程:垃圾回收机制

线程的生命周期

JDK 中用 Thread.State 枚举表示了线程的几种状

线程状态转换图

线程的同步

Synchronized线程同步机制

  1. 在多线程编程,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完整性
  2. 也可以这里理解:线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作

同步具体方法-Synchronized

分析同步原理

互斥锁

基本介绍

1.Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性

2.每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

3.关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时表明该对象在任一时刻只能由一个线程访问

4.同步的局限性:导致程序的执行效率要降低

5.同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象

6.同步方法(静态的)的锁为当前类本身

注意事项和细节

1.同步方法如果没有使用static修饰:默认锁对象为this

2.如果方法使用static修饰,默认锁对象:当前类.class

3.实现的落地步骤:

  1. 需要先分析上锁的代码
  2. 选择同步代码块或同步方法
  3. 要求多个线程的锁对象为同一个即可!

线程的死锁

基本介绍

多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程是一定要避免死锁的发生

释放锁

1.当前线程的同步方法、同步代码块执行结束

       案例:上厕所,完事出来

2.当前线程在同步代码块、同步方法中遇到break、return。

       案例:没有正常结束,叫他修改bug,不得已出来

3.当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束

       案例:进去之后,发现忘带纸,不得已出来

4. 当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁。

       案例:吃饭付款时忘记带钱了,回去取钱,在来吃饭

下面操作不会释放锁

1. 线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行,不会释放锁

       案例:写作业 写的过程中突然睡着了

2. 线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起该线程不会释放锁。

       案例:正在打代码 有人叫出去有事 但是电脑没有关机

提示:应尽量避免使用suspend()和resume()来控制线程,方法不再推荐使用


本章笔记是观看韩顺平的JAVA的视频和在网上找的资料 以及自己的理解总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正


目录
相关文章
|
18天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
95 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
2月前
|
Java
【JavaEE】——多线程常用类
Callable的call方法,FutureTask类,ReentrantLock可重入锁和对比,Semaphore信号量(PV操作)CountDownLatch锁存器,
|
2月前
|
Java 关系型数据库 MySQL
【JavaEE“多线程进阶”】——各种“锁”大总结
乐/悲观锁,轻/重量级锁,自旋锁,挂起等待锁,普通互斥锁,读写锁,公不公平锁,可不可重入锁,synchronized加锁三阶段过程,锁消除,锁粗化
|
2月前
|
Java 程序员 调度
【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
创建线程的五种方式,Thread常见方法(守护进程.setDaemon() ,isAlive),start和run方法的区别,如何提前终止一个线程,标志位,isinterrupted,变量捕获
|
2月前
|
安全 Java API
【JavaEE】多线程编程引入——认识Thread类
Thread类,Thread中的run方法,在编程中怎么调度多线程
|
3月前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
54 6
|
3月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
4月前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
65 5
|
4月前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
94 2
|
4月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
68 2