• (1)I/O流 (2)线程


    1.I/O流
    1.1 ObjectOutputStream类(重点)
    (1)基本概念
    java.io.ObjectOutputStream类主要用于将Java对象整体写入到输出流中。
    只能将支持 java.io.Serializable 接口的对象写入流中。
    类通过实现 java.io.Serializable 接口以启用其序列化功能。
    当把一个对象整体写入输出流时,需要将对象的各种相关信息有效地组织成一个字节序列再存储,这个组织的过程就叫做序列化。

    (2)常用的方法
    ObjectOutputStream(OutputStream out) - 根据参数指定的引用来构造对象。
    - 其中OutputStream类是个抽象类,实参需要传递子类的对象。
    void writeObject(Object obj) - 用于将参数指定的对象写入输出流中。
    void close()

    1.2 ObjectInputStream类(重点)
    (1)基本概念
    java.io.ObjectInputStream类主要用于将Java对象整体从输入流中读取出来。

    (2)常用的方法
    ObjectInputStream(InputStream in) - 根据参数指定的引用构造对象。
    - 其中InputStram类是个抽象类,实参需要传递子类的对象。
    Object readObject() - 用于从输入流中读取对象并返回。
    void close()

    分享经验:
    当需要向文件中写入多个对象时,建议将多个对象放入一个集合中,然后将这个集合整体看做一个对象调用writeObject()方法写入,此时只需要调用一次readObject()方法即可。

    2.线程
    2.1 基本概念
    程序 - 数据结构 + 算法,主要指存放在硬盘上的可执行文件。
    进程 - 主要指运行在内存中的程序。

    目前主流的操作系统都支持多进程,是为了让操作系统能够同时执行多个任务,但进程是重量级的,新建进程对系统资源的消耗比较大,因此进程的数量是有限的。
    线程是进程内部的程序流,也就是说操作系统中支持多进程,而每个进程的内部又可以支持多线程,并且线程是轻量级的,新建线程会共享所在进程的资源,因此对资源消耗比较小。
    以后的主流开发都采用多线程机制,而操作系统中主要采用时间片轮转法来保证多任务的同时执行,该策略叫做并发机制,也就是宏观并行,微观串行的机制。

    2.2 线程的创建(重中之重)
    (1)Thread类创建线程的方式
    java.lang.Thread类主要用于描述线程,Java虚拟机允许Java程序启动多个线程并同时执行
    创建线程的方式:
    a.自定义类继承Thread类并重写run()方法,然后创建自定义类的对象调用start()方法
    b.自定义类实现Runnable接口并重写run()方法,然后创建自定义类的对象作为创建 Thread类对象的实参,最后使用Thread类的对象调用start()方法。

    (2)创建线程的有关方法
    Thread() - 无参的方式构造对象。
    Thread(String name) - 使用参数指定的名称来构造对象。
    Thread(Runnable target) - 根据参数指定的引用来构造对象。
    - 其中Runnable是个接口,实参的传递方式有两种:
    a.自定义类实现Runnable接口,构造自定义类的对象作为实参传递。
    b.使用匿名内部类直接构造接口类型的引用作为实参传递。
    Thread(Runnable target, String name)
    - 使用参数指定的引用和名称共同构造对象。

    void run() -若使用接口类型引用构造的线程对象调用该方法,则最终调用接口指向的版本
    -若没有使用接口引用构造的线程对象调用该方法,则啥也不做。
    void start() - 用于启动线程,Java虚拟机会自动调用该线程对象的run()方法。

    原理(掌握):
    找到Thread类的无参构造方法 => 调用init()方法,第二个实参为null => 点开init()方法的方法体,将实参null赋值给第二个形参target => target作为第二个实参传给init()方法 => 此时init()方法的第二个形参target变成了null => 将null赋值给了成员变量target.
    找到run()方法的源码 => if (target != null) {target.run();},条件不成立 =>
    此时证明run()方法啥也不干。

    (3)线程创建的执行原理
    执行main()方法的线程叫做主线程,执行run()方法的线程叫做子/新线程。
    对于start()方法之前的代码来说,由主线程执行一次,当start()方法调用成功后,则线程的个数瞬间由1个变成了2个,其中新创建的子线程去执行run()方法,主线程继续执行后续代码,两个线程同时执行互不影响。
    当run()方法结束时则子线程结束,当main()方法结束时则主线程结束,两个线程执行的先后次序没有明确的规定,由系统调度算法决定。

    注意:
    创建线程两种方式里面继承相对简单容易理解,但是Java语言支持单继承,若一个类继承Thread类后则无法继承其他类,因此推荐使用第二种方式来创建线程,从而提高代码的可维护性和可扩展性。

    2.3 线程的编号和名称(熟悉)
    long getId() - 用于获取调用对象的线程编号。
    String getName() - 用于获取调用对象的线程名称。
    void setName(String name) - 用于设置线程名称为参数指定数值。
    static Thread currentThread() - 用于返回当前正在执行线程对象的引用。

    2.4 线程的主要状态(了解)
    新建状态 - 当使用new关键字创建线程对象之后进入的状态。
    - 此时该线程并没有开始执行。
    就绪状态 - 当线程对象调用start()方法之后进入的状态。
    - 此时该线程仍然没有开始执行。
    运行状态 - 当线程对象被线程调度器调度之后进入的状态。
    - 此时该线程开始执行。
    - 当线程对象的时间片执行完毕但任务没有完成时回到就绪状态。
    消亡状态 - 当线程对象的时间片执行完毕并且任务已经完成后进入的状态。
    阻塞状态 - 当线程执行过程中发生阻塞事件后进入的状态,如:sleep()方法。
    - 当阻塞解除后进入就绪状态。

    2.5 常用的方法
    static void sleep(long millis)
    - 用于使得当前正在执行的线程进入休眠状态,休眠参数指定的毫秒(重点)。
    static void sleep(long millis, int nanos)
    - 用于休眠参数指定的毫秒+纳秒,1秒=1000毫秒 1毫秒=1000微秒 1微秒=1000纳秒

    不忘初心,方得始终! 坚持!坚持!坚持!!
  • 相关阅读:
    repair table
    rmtree函数
    alias 新的命令='原命令 -选项/参数'。举例说明,alias l=‘ls -lsh' 将重新定义 ls 命令,现在只需输入 l 就可以列目录了。
    MySQL DATE_SUB() 函数
    freebsd开启root远程登陆
    nbtscan ip地址
    FreeBSD 安裝 wget
    genlist -s 192.168.21.*
    /pentest/enumeration/0trace
    CSS的margin属性:详解margin属性
  • 原文地址:https://www.cnblogs.com/sumboy/p/9058591.html
Copyright © 2020-2023  润新知