java基础的详细了解第八天

Java基础的详细了解第八天攻略

一、多线程

1. 线程的创建(继承Thread类)

Java中创建线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。第一种方式的具体代码如下:

class MyThread extends Thread {
    @Override
    public void run() {
        // 线程要执行的代码
    }
}

其中,run方法中写的是线程要执行的代码。线程启动,只需要创建一个MyThread的实例,并调用start()方法即可。

MyThread thread = new MyThread();
thread.start();

2. 线程的创建(实现Runnable接口)

另外一种创建线程的方式是实现Runnable接口。具体代码如下:

class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程要执行的代码
    }
}

同样,线程启动也只需要创建一个MyRunnable实例,并调用start()方法即可。

MyRunnable r = new MyRunnable();
Thread thread = new Thread(r);
thread.start();

3. 线程的生命周期

线程的生命周期包括6个状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)和终止(Terminated)。

其中,新建状态指线程创建后还未调用start()方法的状态;就绪状态指线程调用start()方法后,等待CPU资源的状态;运行状态指CPU正在执行该线程的状态;阻塞状态指线程由于某些原因(如获取锁失败、IO操作等)暂时停止执行的状态;等待状态指线程进入等待状态后,需要等待其他线程的通知才能继续执行;终止状态表示线程执行完毕的状态。

4. 线程同步

线程同步是指非常多线程访问共享资源时的一种机制。

Java中提供了synchronized关键字和Lock接口实现线程同步,其实现机制是通过对象的锁来保护关键代码块避免多线程对共享资源的争抢。

class SynchronizedDemo {
    private int count = 0;

    public synchronized void add() {
        count++;
    }
}

在上述代码中,add()方法被synchronized修饰,同步加锁,就可以保证同时最多只有一个线程可以执行该方法。

5. 线程池

线程池主要解决线程生命周期(线程的创建、销毁)开销大,线程数量过多导致系统负载过重等问题。线程池可以将大量任务分给少量线程处理,处理完成后,线程不会被销毁,而是继续保留在池中等待下一次使用。

Java中提供了ThreadPoolExecutor类实现线程池,其具体代码如下:

ExecutorService executorService = new ThreadPoolExecutor(5, 10,
                60L, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>());

其中,参数的意义分别为:线程池核心线程数、线程池最大线程数、线程池空闲线程存活时间、单位时间、阻塞队列。

在使用时,只需要将Runnable任务提交到线程池中即可:

executorService.execute(new MyRunnable());

二、输入输出流

1. Java IO概述

Java IO是指Java的输入输出,负责程序与外界的交流。Java中的IO系统分为三个部分:字节流、字符流、输入/输出流(包括控制台输入输出和文件输入输出)。

Java中的IO操作以字节为单位,即每个创建的字节流对应一个8位二进制字节序列,而输入/输出操作都是基于流的。

2. 字节流

字节流是Java IO操作中的第一种流,用于操作二进制文件,输入输出操作以字节为单位。

Java中的字节流共包含4个类:InputStream/BufferedInputStream/FileInputStream和OutputStream/BufferedOutputStream/FileOutputStream。

例如,使用FileInputStream读取二进制文件代码如下:

FileInputStream fis = null;
try {
    fis = new FileInputStream("file.bin");
    int n = -1;
    while ((n = fis.read()) != -1) {
        // 处理字节数组
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (fis != null) {
            fis.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3. 字符流

字符流用于操作文本文件,输入输出操作以字符为单位,一次可以读取多个字符。

Java的字符流共包含4个类:Reader/BufferedReader/FileReader和Writer/BufferedWriter/FileWriter。

例如,使用FileReader读取文本文件并输出文件内容的代码如下:

FileReader fr = null;
try {
    fr = new FileReader("file.txt");
    int n = -1;
    while ((n = fr.read()) != -1) {
        // 处理字符
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (fr != null) {
            fr.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

以上是Java基础的详细了解第八天的攻略,其中包括了多线程和输入输出流两部分内容,希望可以帮助到学习Java的同学们。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java基础的详细了解第八天 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • Java 其中翻转字符串的实现方法

    要实现Java中字符串翻转,有多种方法可以选择,包括使用for循环、StringBuilder和递归等。下面将分别介绍它们的实现方法: 使用for循环 使用for循环实现Java中字符串的翻转,可以先将字符串转换成字符数组,再使用两个指针分别从字符串的开头和结尾向中间遍历,每遍历一次,则将两个指针指向的字符互换位置,最终完成翻转。代码如下: public s…

    Java 2023年5月27日
    00
  • 你可能从未使用过的11+个JavaScript特性(小结)

    下面是详细讲解“你可能从未使用过的11+个JavaScript特性(小结)”的攻略。 介绍 本文将讲解11+个在JavaScript中常被忽略的特性。包括可选链操作符、空合并运算符、BigInt、Promise.allSettled()、Array.flat()、Array.flatMap()、Object.fromEntries()、String.trim…

    Java 2023年5月26日
    00
  • 详解用java描述矩阵求逆的算法

    详解用Java描述矩阵求逆的算法 算法概述 在线性代数中,矩阵求逆是一个很重要的问题,它在各种科学计算中发挥着关键作用。矩阵求逆也被用于解决多元线性回归等问题。 基本上所有矩阵求逆算法都是基于高斯-约旦变换(Gauss-Jordan elimination)来工作的,该算法旨在通过对原始矩阵进行顺序消元、列缩放和行交换等操作,从而生成一个沿着对角线对称的单位…

    Java 2023年5月19日
    00
  • jquery ajaxfileupload异步上传插件

    jquery ajaxfileupload异步上传插件是一款可以在页面上实现文件异步上传的插件,可以帮助我们更方便地实现文件上传功能,并且使用方便、易于操作。下面是这款插件的完整攻略: 一、安装和引用 jquery ajaxfileupload异步上传插件可以使用npm包管理器进行安装,也可以使用CDN引入。以下是使用CDN引入的方法: <script…

    Java 2023年5月20日
    00
  • 浅谈Java动态代理的实现

    浅谈 Java 动态代理的实现 什么是动态代理? Java 中的代理分为静态代理和动态代理两种。静态代理需要事先写好代理类,通过程序员手动编写的方式,代理对象和目标对象之间的关系就已经确定了。而动态代理是在程序运行时动态生成的代理对象,不需要事先写好代理类。动态代理可以根据目标对象动态地生成代理对象,无需为每个目标对象都编写代理类,增强代码的可重用性。 实现…

    Java 2023年5月26日
    00
  • 基础不牢,地动山摇,Java基础速来刷刷

    基础不牢,地动山摇,Java基础速来刷刷攻略 1. 基础概念的理解 在学习 Java 的过程中,首先需要掌握一些基础概念,例如:JVM、JRE、JDK、类、对象、接口、继承、多态、异常等等。这些基础概念是 Java 编程的基石,如果不牢固掌握这些基础概念,日后的 Java 编程会遇到很多问题。 2. 编程语言和工具的熟练掌握 在掌握了基础概念后,需要熟练掌握…

    Java 2023年5月26日
    00
  • java如何读取某个文件夹中的全部文件(包括子文件夹)

    Java读取某个文件夹中的全部文件包括子文件夹,可以通过以下步骤实现: 获取要读取的文件夹路径 创建文件对象 遍历文件夹及其子文件夹中的所有文件,并将文件路径存储在List中 以下是完整的Java读取某个文件夹中的全部文件包括子文件夹的示例代码: 示例1:使用递归方法实现 import java.io.File; import java.util.Array…

    Java 2023年5月19日
    00
  • 详细聊聊SpringBoot中动态切换数据源的方法

    下面是详细聊聊SpringBoot中动态切换数据源的方法的完整攻略,主要分为以下几个部分: 1. 前置条件 在使用SpringBoot动态切换数据源之前,我们需要准备以下环境和工具: SpringBoot框架(推荐使用最新版) 数据源配置文件(指定一个或多个数据库配置,其中至少要包含一个默认数据源配置) 动态数据源切换工具类(可自己实现或者选择第三方库) 接…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部