admin管理员组

文章数量:1566223

写在最前边:

研究生一枚,为后端实习和未来工作打基础。无意间发现韩顺平老师的课程,细心细致,讲课和吴恩达老师一样,都是保姆式讲解,各种基础知识都会补充,爱了。
韩顺平老师课程地址:https://www.bilibili/video/BV1fh411y7R8?spm_id_from=333.999.0.0
阅读提醒:本笔试适合有编程语言基础的伙伴阅读,因为本兔兔是本专业的,有c、c++、python 、sql基础,笔记中特别的基础的内容就没有记录。完全零基础的小伙伴建议跟着韩老师的课程自己记录。


============================= ❀ 坦 克 大 战 ❀ =============================

============================== ❀ 1.0 版 本 ❀ ==============================

用到泛型及其之前的知识

一、Java绘图坐标体系

1、像素——密度单位(与厘米这种长度单位完全不是一回事

与分辨率有关:分辨率越高像素越大,密度越高,展示的东西越丰富。
像素 = 分辨率的长× 宽

2、坐标介绍

  • 坐标 原点 位于左上角
  • 坐标单位是 像素
  • (x , y)

二、Java绘图入门

1、步骤

  • 定义一个类MyPanel extends JPanel,作为画板;
  • MyPanel 类中重写paint方法,使用Graphics类 作为画笔。进行一系列方法绘图;
  • 定义一个类 DrawCircle extends JFrame ,作为活动窗口展示画板内容
  • DrawCircle 类中 声明一个画板类 MyPanel
  • 在DrawCircle 类的构造器或者其他方法中创建MyPanel 对象并加入当前DrawCircle 类对象中
  • 设置窗口大小以及是否显示
代码实例
import javax.swing.*;
import java.awt.*;
public class MyPanel extends JPanel{
   @Override
   public void paint(Graphics g) {
       super.paint(g);
       g.drawOval(0,0,50,50);
   }
}
public class DrawCircle extends JFrame {
   private MyPanel mp = null;
   public static void main(String[] args) {
       new DrawCircle();
   }
   public DrawCircle(){
       mp = new MyPanel();
       this.add(mp);
       this.setSize(200,200);
       this.setVisible(true);
   }
}

2、重要类的方法

3、paint方法何时被调用

4、Graphics类(画笔)的绘图方法

https://www.bilibili/video/BV1fh411y7R8/?p=572&spm_id_from=pageDriver&vd_source=863cd5165874b9e91cbd88db7b5eaa82

5、Java事件处理机制——以键盘控制小球移动为例

  • 实现键盘监听接口 KeyListener 即可监听键盘事件KeyEvent
    • 事件源:可以产生一个事件的对象,如按钮、窗口等
    • 事件:承载 事件源 状态改变时的信息 的事件类的对象,比如按下的按钮值之类的。事件类
    • 事件监听者:是一个 ==实现了某些 事件监听器接口 ==的,对监听到的时间进行业务 处理
此时,通过之前知识的运用,我们可以画出很多坦克,并且控制自己坦克的移动。还需要在2.0版本实现敌人坦克的自动移动呀↓

============================== ❀ 2.0 版 本 ❀ ==============================

加入多线程基础知识

补充:IDEA中的 jconsole可视化线程工具

1、一些概念

  • 程序:一段代码,静态的

····· 例如:迅雷应用代码

  • 进程:程序运行一次,动态的(具有产存在、消亡的过程)

·······例如:迅雷应用

  • 线程:进程创建的一个实体,一个进程可以有多个线程。线程就是小任务,一个应用程序可以有很多小任务。

······例如:迅雷应用中的下载任务

  • 并发与并行:

······都是执行多任务的前提:
······单核CPU 是并发——通过交替执行使得用户认为在同时执行
······多核CPU 是并发——真正的同时执行
······当电脑执行任务个数超过CPU个数,则并发和并行在电脑中都存在
······Java查看电脑CPU的个数

2、线程分类

  • 单线程:同一时刻,只能执行一个线程。
  • 多线程:同一时刻,可以执行多个线程。如qq可以同时打开多个聊天窗口

3、Java创建线程的方法本质都是使用Start0()

  • 方法一:继承Thread,重写run()方法为自己的业务逻辑,然后该类就可以看为一个线程
class Cat extends Thread{
	run(){....}
}
public  class  Thread01{
	//main方法就是 主线程 
	public static void main(String[] args) throw InterruptedException{
		//Cat对象就是一个线程
	 	Cat cat = new Cat();
		cat.start(); 
		//主线程不会被阻塞
		for(int i = 0 ; i < 10 ;i++){
		...
		}
 }

记住1:进程结束的标志 不是主线程main结束,要看所有线程是否结束。
记住2:线程 也可以开辟 另一个线程
为什么在main使用start()方法启动线程而不是run()呢?
run()是一个普通方法,没有启动线程,并且会阻塞程序直到run执行完毕程序再继续执行 。
start()源码:


  • 方法二:实现Runnable接口,重写run()方法为自己的业务逻辑,然后该类就可以看为一个线程(底层使用了代理模式)韩老师讲解视频地址
    对单继承机制的补充,使得某类继承了其他类的情况还可以使用多线程。同时适用于多个线程共享一个资源的情况。

线程类中的声明同上。但是创建线程不能直接使用start类,而是封装到Thread中才可以使用start()。

>public  class  Thread02{
	//main方法就是 主线程 
	public static void main(String[] args) throw InterruptedException{
		//Cat对象就是一个线程
	 	Cat cat = new Cat();
		//cat.start(); 不能使用了
		Thread thread = new Thread(cat);
		thread .start();
		//主线程不会被阻塞
		for(int i = 0 ; i < 10 ;i++){
		...
		}
 }

4、线程终止

  • 线程任务完成后,自动退出;
  • 使用变量,在run()方法中控制线程退出,使得其他线程可以控制线程的终止。通知方式

5、线程常用方法1

优先级:

interrupt()方法,一般用于中断(唤醒)正在休眠的线程。会抛给正在休眠的线程一个异常,那么在catch中我们就可以写上自己的 中断休眠后的业务逻辑代码。这也是为什么sleep()方法必须用try-catch的原因

6、线程常用方法2

7、线程常用方法3

  • 用户线程:又叫工作线程
  • 守护线程:服务工作线程(常见的是垃圾回收机制)
  • 二者关系:所有用户线程结束,守护线程自动结束
  • 应用场景:
    有一个线程是死循环,那么当所有其他线程都结束了,他还不结束岂不是程序永远不结束了?因为我们要把他设置为守护线程,以便他可以结束。
    设置方法——使用类.setDaemon(true)即可

8、线程7大状态

``java中的 Thread.State枚举了六种状态,但是RUNNABLE状态还可以细分为两个内核状态。
  • #####NEW
  • RUNNABLE
    • Ready 就绪态
    • Running 执行态
  • BLOCKED
  • WAITING
  • TIME_WAITING
  • TERMINATED

9、线程同步机制 Synchronized

``首先注意,锁的对象应该是同一个呀。如果我们new 了好几个那么底层就不是一个对象了,线程之间也没有争抢了。

使用Synchronized的2种方法
  • 同步 代码块推荐使用,范围精准

  • 同步 方法


注意:run()方法不要写成Synchronized的呀

10、互斥锁

锁实际是在对象/.class上,而不是代码块上
synchronized (this)是非公平锁


细节5

细节6

11、死锁

12、释放锁

释放锁的4种时机
不会 释放锁的2种情况

============================== ❀ 3.0 版 本 ❀ ==============================

加入I/O流知识


1、一些概念

  • 文件:保存数据的地方(文档、音频、视频…)
  • 文件流: 文件在程序中是以流的形式来操作的

  • 文件 VS 流:

流不生产数据,只是文件数据的搬运工

2、常用文件操作 File类的使用

  • (1)使用 File类 创建文件的三种方法
    1.File可以创建目录(文件夹)或者文件(如.txt) , 因为在java中目录也被当做是文件
    2.new File(...) 只是创建了一个file对象,只有使用createNewFile()方法的时候才会真正创建文件夹/文件
  • (2)File类的获取文件信息的方法
    可以通过类图查看
  • (3)File类的目录操作
    • mkdir 创建一级目录
    • mkdirs 创建多级目录
    • delete 删除目录或文件

3、IO流原理


每创建一个IO流类的对象,其实就是分配了一个外卖小哥来送货(文件数据),至于到底一个文件中的数据怎么全部运输完(输入内存/输出到外部),根据每个外卖小哥自己的方法来决定,并且外卖小哥运输完成这一单后,应该被释放,以便可以继续接活

4、IO流分类

  • 按操作数据的单位长度划分:
    1)字节流(8bit)
    好处:效率较低,适用于二进制文件,保证对二进制文件(如音频、视频、doc、pdf)的无损操作
    
    2)字符流(=多少字节?根据文件编码来看)
    好处:效率较高,适用于文本文件
    
  • 按数据流的流向划分:
    1)输入流
    2)输出流

以上四种可以两两组合成为四种 【抽象类】成为IO流中其他类的抽象基类,也就是说其他IO流类都是这四种抽象类的子类:





细节:字符流FileWriter进行写操作时,必须 close或者flush一下(刷新一下,否则还没有写入指定文件)



5、节点流和处理流

  • 1)节点流 :初级的外卖员,只能配送一种货物
    从特定的数据源读写数据 。如FileReader 、 FileWriter、FileInputStream、FileOutputStream等
    缺点:直接对数据源进行操作,不够灵活

  • 2)处理流(包装流):高级的外卖员,能配送多种货物
    连接在 已存在的 节点流或处理流上,提供更强大的读写功能。如:BufferedReader、BufferedWriter


    优点1:处理流内部封装一个Reader/Writer/InputStream/OutputStream属性,即封装了一个节点流。那么使用的可以是任何的四大抽象基类的子类:
    优点2:进行功能扩展
    优点3、4
    处理流的设计模式——修饰器模式:
    韩老师讲解视频地址


  • 节点流、处理流的区别和联系


  • 2.1)对象流 属于处理流
    以上过程即 序列化和反序列化操作:
    如何进行序列化和反序列化?

    序列化后的文件类型是.dat
    细节:
  • 2.2)标准输入输出流 属于处理流
    • 键盘输出、显示器输出
  • 2.3)转换流 属于处理流
    • 由IO流默认使用UTF-8格式读取文件,所以有时会遇到文件乱码,所以需要字节流 —> 字符流
    • 使用InputStreamReader、OutputStreamReader类完成转换工作

      代码例子展示:
  • 2.4)打印流 属于输出处理流,没有输入流哦
    • 使用PrintStream、PrintWriter类完成转换工作

      默认打印到显示器,都可以使用SetOut()方法修改打印路径:

6、配置文件的读写操作

配置文件不用IO流读写,而是使用专门的类Properties类:

  • Properties类介绍
  • Properties的方法介绍
    代码展示
    

本文标签: 线程坦克大战基础韩顺平