java中线程池、Lambda表达式、file类、递归

线程池:

在多线程的使用过程中,会存在一个问题:如果并发的线程数量很多,并且每个线程都执行一个时间很短的任务就结束,这样频繁的创建线程就会大大降低系统的效率,因为线程的创建和销毁都需要时间。

线程池: 为了解决上面频繁的创建和销毁线程的问题,在java中可以通过线程池来达到线程复用的场景,也就是一个线程在执行完一个任务后,不会被销毁,而是继续执行其他的任务。线程池实际就是一个容纳线程的容器,省去了频繁创建线程对象的操作,节约了很多资源。
请添加图片描述
线程池执行原理:请添加图片描述
线程池的使用:

设置线程任务:

public class RunnableImpl implements Runnable {
    @Override
    public void run(){
        System.out.println("线程:" + Thread.currentThread().getName());
    };
}

使用过程:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// java.util.concurrent.Executors:线程池的工厂类,用来生成线程池,其中有一个方法用来生成一个指定线程数的线程池:newFixedThreadPool(int n)
// 线程池的使用步骤:
// 1.使用线程池的工厂类:Executors里的静态方法newFixedThreadPool创建一个指定线程的线程池
// 2.创建一个类,实现Runnable接口,重写run方法设置线程任务
// 3.调用ExecutorService中的submit方法,传递线程任务(刚刚创建的实现类)开启线程
// 4.调用ExecutorService中的shutdown销毁线程池(不建议使用,只有线程池不需要的时候才会用到该方法)
public class ThreadPool {
    public static void main(String[] args) {
        // 获取线程池:
        ExecutorService es = Executors.newFixedThreadPool(2); // 指定线程池数量
        // 执行线程任务:线程池会一直开着,使用完了线程,会自动把线程归还给线程池,线程可以继续执行
        es.submit(new RunnableImpl()); // 线程:pool-1-thread-1
        // es.shutdown(); // 执行此代码关闭线程池,后面代码在执行会抛异常
        es.submit(new RunnableImpl()); // 线程:pool-1-thread-2
        es.submit(new RunnableImpl()); // 线程:pool-1-thread-1,第一次使用完后会归还给线程池继续被使用
    }

Lambda表达式:

Lambda表达为了解决冗余代码问题的,从创建一个多线程任务的案例来看,为了执行run任务,是不断的调用对象的方法,此过程为面向对象编程,为了执行一个run任务(打印一句话)发现写了很多无关的代码,但是这些代码在面向编程中又不能没有,此时为了简化代码书写减少代码冗余,可以采用函数式编程,函数式编程是一个只注重结果,不注重是谁完成了这个事,Lambda就是函数式编程思想。

Lambda表达式由三部分组成:一些参数、一个箭头、一段代码

import java.util.Arrays;
import java.util.Comparator;

public class LambdaTest {
    public static void main(String[] args){
        // 1.测试lambda表达式:
        // 使用匿名内部类创建一个线程任务:
        new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println("执行任务!");
            };
        }).start();

        // 使用Lambda创建一个线程任务:
        new Thread(()->{
            System.out.println("执行Lambda任务!");
        }).start();

        // Lambda更优写法:其中括号为run方法的参数,可以接收前面需要传递的参数,箭头表示将参数传递给后面,箭头后面的语句为业务逻辑代码
        new Thread(()->System.out.println("执行Lambda任务2!")).start();

        // 2.调用useSayHayInterFace方法:
        useSayHayInterFace(new SayHay(){
            @Override
            public void sayhello(){
                System.out.println("重写sayhello方法");
            };
        });

        // 3.使用lambda表达式调用useSayHayInterFace方法:
        useSayHayInterFace(()->System.out.println("重写sayhello方法2"));

        // 4.使用lambda表达式联系一个数组中存储多个person对象,并对其以年龄进行排序:
        Person[] list = { new Person("小明",18), new Person("小红",20),new Person("小美",10) };
        Arrays.sort(list, new Comparator<Person>(){
            @Override
            public int compare(Person a,Person b){
                return a.getAge() - b.getAge();
            };
        });
        for (Person p : list) {
            System.out.println(p);
        };
        System.out.println("----------------------------");
        // 使用lambda表达式简化:
        Arrays.sort(list, (Person a,Person b)->{
            return b.getAge() - a.getAge();
        });
        for (Person p : list) {
            System.out.println(p);
        };
    };

    // 定义一个方法使用接口:
    public static void useSayHayInterFace(SayHay s){
        s.sayhello();
    };
}

file类:

file类是文件和目录路径名的抽象表示,主要用于文件和目录的创建和查找及删除等操作。

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Objects;

public class FileDemo {
    // 1.file类可以创建一个文件或文件夹、删除一个文件或文件夹、获取一个文件或文件夹
    // 2.file类与操作系统无关,任何操作系统都可以使用此类
    public static void main(String[] args) throws IOException {
        // 3.File类的pathSeparator属性用来获取路径分隔符
        String pathSeparator = File.pathSeparator;
        System.out.println(pathSeparator); // 打印了一个封号,windows分隔符是一个分号,linux会打印一个冒号

        // 4.File类的separator属性用来获取文件名分隔符:
        String separator = File.separator;
        System.out.println(separator); // 打印了一个反斜杠,windows返回一个反斜杠,linux返回一个正斜杠

        // 5.路径:分绝对路径和相对路径,相对路径是相对于当前项目的根目录,绝对路径是相对于盘符开始的,路径不区分大小写,windows中文件名分隔符为反斜杠,需要写两个反斜杠进行转义。

        // 6.File类的构造方法:此构造方法传入一个路径,用来创建一个新的File实例,这个路径可以是以文件名结尾,也可以以文件夹结尾,也可以是一个不存在的路径
        File fs = new File("D:\\00.java高级\\练习\\javaDemo\\073file类");
        System.out.println(fs); // D:\00.java高级\练习\javaDemo\073file类

        // file类的构造方法也可以传递两个参数:第一个父路径,第二个为子路径:实际就是将两个路径进行拼接在一起:
        File fs2 = new File("c://","a.text");
        System.out.println(fs2); // c:\a.text

        // file类的第一个参数父路径也可以传入一个file类:
        File fs3 = new File(fs, "b.text"); // 这里的父类路径后面可以调用它的方法得到想要的值:
        System.out.println(fs3); // D:\00.java高级\练习\javaDemo\073file类\b.text

        // 7.getAbsoluteFile()方法用来获取File类的绝对路径,String.valueOf是这个java版本中结局报错的
        File fs4 = new File("ab.text");
        String p3 = String.valueOf(fs4.getAbsoluteFile());
        System.out.println(p3); // D:\00.java高级\练习\javaDemo\073file类\ab.text

        // 8.getPath方法获取File类的真实路径,传递的什么,返回的就是什么:
        File fs5 = new File("D://files//hello.text");
        String p5 = fs5.getPath();
        System.out.println(p5); // D:\files\hello.text

        File fs6 = new File("hello.text");
        String p6 = fs6.getPath();
        System.out.println(p6); // hello.text

        // 9.getName方法获取File类的结尾部分,可以是一个文件夹或文件名:
        String fsname = fs.getName();
        System.out.println(fsname); // 073file类
        String fileName = fs5.getName();
        System.out.println(fileName); // hello.text

        // 10.length获取文件的大小,以字节为单位:如果路径不存在,则返回0,文件夹返回的也是0
        File fslength = new File("D:\\00.java高级\\练习\\javaDemo\\073file类\\FileDemo.java");
        Number sizes = fslength.length();
        System.out.println(sizes); // 3261

        // 11.exists方法用来判断File表示的文件或路径是否存在:
        File isExist = new File("hello.java");
        System.out.println(isExist.exists()); // false

        // 12.isDirectory判断给定的路径是否以文件夹结尾,isFile判断给定的目录是否以文件结尾:(特别提示:这个两个方法都是建立在路径真实存在的情况下,如果不存在则都表示false)
        System.out.println(fs.isDirectory()); // true
        System.out.println(fs.isFile()); // false
        System.out.println(isExist.isFile()); // false
        System.out.println(isExist.isDirectory()); // false
        System.out.println(fslength.isFile()); // true
        System.out.println(fslength.isDirectory()); // false

        // 13.createNewFile()方法用来创建文件,如果File类没有此文件就去创建文件并返回一个true,如果已存在文件再去创建,会返回false;创建文件的路径必须存在,否则会抛出异常:
        File ft = new File("D:\\00.java高级\\练习\\javaDemo\\073file类\\hello.text"); // 路径是相对或绝对都可以
        boolean file1 = ft.createNewFile(); // 此方法或抛出异常,可以使用try/cathc或直接抛出给虚拟机处理
        System.out.println(file1); // true,第一次执行返回一个true并生成一个hello.text文件,再次执行代码就返回false,因为已经存在了此文件

        // 14.mkdir和mkdirs用来创建文件夹,mkdir用来创建单级文件夹,mkdirs用来创建多级文件夹,它们创建的都是空文件夹,如果原本文件夹不存在去创建返回true,原本文件夹存在或路径不存在都返回false,它们只能创建文件夹,不能创建文件,绝对和相对路径都支持,路径不存在不会抛异常:
        File fp = new File("D:\\00.java高级\\练习\\javaDemo\\073file类\\newfile1");
        boolean isOk = fp.mkdir();
        System.out.println(isOk); // true,也是第一次返回true,再次执行返回false

        File fm = new File("D:\\00.java高级\\练习\\javaDemo\\073file类\\newfile2\\001\\01\\1");
        boolean isOkMor = fm.mkdirs(); // 创建多级文件夹
        System.out.println(isOkMor); // true,也是第一次返回true,再次执行返回false

        // 15.delete方法可以删除文件或文件夹,文件或文件夹删除成功返回true,文件夹中有内容时不会被删除返回false,构造方法中的路径不存在时也返回false(在硬盘中删除,不走回收站)
        File rm = new File("D:\\00.java高级\\练习\\javaDemo\\073file类\\hello.text");
        boolean isRm = rm.delete();
        System.out.println(isRm); // true

        File rm2 = new File("D:\\00.java高级\\练习\\javaDemo\\073file类\\newfile2\\001\\01\\1");
        boolean isRm2 = rm2.delete();
        System.out.println(isRm2); // true,这里删除的1这个文件夹,需要注意!

        // 16.list和listFiles方法用来遍历目录,list返回一个字符串数组,表示该文件夹中所有子文件或子文件夹;listFiles返回的是一个文件类型数组,如果构造方法中的路径不存在,会抛出异常,如果构造方法中的路径不是一个目录,也会抛出异常
        File fslist = new File("D:\\00.java高级\\练习\\javaDemo\\073file类");
        String[] ls = fslist.list();
        System.out.println(Arrays.toString(ls));
        System.out.println("-----1------");
        for (String s : Objects.requireNonNull(ls)) {
            System.out.println(s);
        }
        File[] flist = fslist.listFiles();
        System.out.println(Arrays.toString(flist));
        System.out.println("-----2------");
        for (File f : Objects.requireNonNull(flist)) {
            System.out.println(f);
        }
    }
}

递归:

java中递归是指方法的自调用,递归可分为直接递归(直接调佣自己)和间接递归(在a方法中调用b方法,b方法中又调用了a方法);递归中应该有条件限制和次数不能太多,否则容易导致栈溢出,递归应该有结束条件。

过滤规则:

import java.io.File;
import java.io.FileFilter;

public class FileFilterImpl implements FileFilter {
    // 1.实现一个FileFilter接口并重写接口中的accept方法实现过滤规则:
    @Override
    public boolean accept(File pathname){
        // 返回true会放过这个值,返回false会过滤掉:
        if (pathname.isDirectory()) {
            // 如果是文件夹也返回true继续遍历
            return true;
        }
        return pathname.getName().toLowerCase().endsWith(".java");
    };
}

递归测试:

import java.io.File;
import java.util.Objects;

public class ForMethods {
    public static void main(String[] args){
        // 1.实现递归:
        int num = 0;
        count(num);

        // 2.过滤器:listFiles方法有两个重载形式,里面传入一个FileFilter接口的实习类对象可对目录项进行过滤:
        File fslist = new File("D:\\00.java高级\\练习\\javaDemo\\074.递归");
        // 传入FileFilter接口的实现类对象进行过滤数据
        File[] flist = fslist.listFiles(new FileFilterImpl());
        for (File f : Objects.requireNonNull(flist)) {
            // System.out.println(f);
        }

        // 3.过滤器找到所有的java结尾的文件:
        File fs = new File("D:\\00.java高级\\练习\\javaDemo\\074.递归");
        getAllFile(fs);
    }
    public static void count(int i){
        if (i > 10) { // 结束条件,递归的次数不能太多,否则会有栈溢出
            return;
        } else {
            // System.out.println(i);
            i++; // 改变条件变量
            count(i);
        }
    };

    //3.递归的方式打印出以java结尾的文件:
    public static void getAllFile(File dir){
        File[] files = dir.listFiles(new FileFilterImpl());
        for (File f : Objects.requireNonNull(files)) {
            // 如果是目录则继续递归遍历,否则打印文件名
            if (f.isDirectory()) {
                getAllFile(f);
                System.out.println("继续递归:" + f);
            } else {
                System.out.println(f);
            }
        }
    };
}

提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者删除。
笔者:苦海

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/46377.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

集睿致远推出CS5466多功能拓展坞方案:支持DP1.4、HDMI2.1视频8K输出

ASL新推出的 CS5466是一款Type-C/DP1.4转HDMI2.1的显示协议转换芯片,&#xff0c;它通过类型C/显示端口链路接收视频和音 频流&#xff0c;并转换为支持TMDS或FRL输出信令。DP接收器支持81.Gbp s链路速率。HDMI输出端口可以作为TMDS或FRL发射机工作。FRL发射机符合HDMI 2.1规范…

mac 移动硬盘未正常退出,再次链接无法读取(显示)

&#xff08;1&#xff09;首先插入自己的硬盘&#xff0c;然后找到mac的磁盘工具 &#xff08;2&#xff09;打开磁盘工具&#xff0c;发现自己的磁盘分区在卸载状态&#xff1b;点击无法成功装载。 &#xff08;3&#xff09;打开终端&#xff0c;输入 diskutil list查看自…

vue 3.0 下载本地pdf文件

使用a标签,把pdf文件放到public文件夹下面 <el-form label-width"160px"> <el-form-item label"使用手册"> <div class"form-item-static"> <a href"/使用手册.pdf" target"_blank" class"link&q…

AC695-按键处理-带UI

AC695-按键修改 消息发出 对应界面处理

云安全攻防(二)之 云原生安全

云原生安全 什么是云原生安全&#xff1f;云原生安全包含两层含义&#xff1a;面向云原生环境的安全和具有云原生特征的安全 面向云原生环境的安全 面向云原生环境的安全的目标是防护云原生环境中的基础设施、编排系统和微服务系统的安全。这类安全机制不一定会具有云原生的…

ChatGPT的工作原理:从输入到输出

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

【程序人生】如何在工作中保持稳定的情绪?

前言 在工作中保持稳定的情绪是现代生活中一个备受关注的话题。随着职场压力和工作挑战的增加&#xff0c;我们常常发现自己情绪波动不定&#xff0c;甚至受到负面情绪的困扰。然而&#xff0c;保持稳定的情绪对于我们的工作效率、人际关系和整体幸福感都至关重要。 无论你是…

VMware NSX Advanced Load Balancer (NSX ALB) 22.1.4 - 负载均衡平台

VMware NSX Advanced Load Balancer (NSX ALB) 22.1.4 - 负载均衡平台 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-nsx-alb-22/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 负载均衡平台 NSX Advanced Load…

day01_springboot综合案例

springboot项目 课程目标 1. 【掌握】SSM整合 2. 【掌握】使用SSM完成查询 3. 【理解】AdminLTE 4. 【理解】理解SSM综合案例表的结构springboot环境搭建 搭建工程 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http…

vscode恢复被误删的文件(巧用本地历史记录)

背景&#xff1a;&#xff08;希望永远不要有这个背景&#xff09;使用vscode开发项目时&#xff0c;新建了文件&#xff0c;且文件没有git add、没有git stash、没有git commit。但是不小心点中了撤销更改&#xff08;新文件的撤销更改&#xff0c;其实就是删除该新文件&#…

Set集合类详解(附加思维导图)

目录 一、Set集合思维导图 二、set集合类常用方法 2.1、HashSet集合常用方法 2.2、TreeSet集合的使用 三、HashSet、LinkedHashSet、TreeSet的使用场景 四、list和set集合的区别 一、Set集合思维导图 二、set集合类常用方法 2.1、HashSet集合常用方法 ①&#xff1a;add…

windows部署安装redis安装教程

1、下载redishttps://github.com/tporadowski/redis/releases 2、下载完然后双击安装 比较简单 略过 3、测试是否安装成功 提示bug Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf …

Flink状态的理解

Flink是一个带状态的数据处理系统&#xff1b;系统在处理数据的过程中&#xff0c;各算子所记录的状态会随着数据的处理而不断变化&#xff1b; 1. 状态 所谓状态State&#xff0c;一般指一个具体的 Task 的状态&#xff0c;即线程处理过程中需要保存的历史数据或历史累计数据…

如何判断某个视频是深度伪造的?

目录 一、前言 二、仔细检查面部动作 三、声音可以提供线索 四、观察视频中人物的身体姿势 五、小心无意义的词语 深造伪造危险吗&#xff1f; 一、前言 制作深度伪造视频就像在Word文档中编辑文本一样简单。换句话说&#xff0c;您可以拍下任何人的视频&#xff0c;让他…

HEVC网络适配层介绍

h265 的分层结构 分层结构的目的 ○ 网络类型多种多样&#xff0c;不同的网络环境具有不同的特性&#xff0c;压缩视频在其中进行传输必然会受到影响&#xff1b;比如不同网络的 MTU 有所不同&#xff1b; ○ 不同的应用场景对视频有不同的需求&#xff0c;视频业务会喜用不…

html2Canvas+jsPDF 下载PDF 遇到跨域的对象存储的图片无法显示

一、问题原因 对象存储的域名和你网址的域名不一样&#xff0c;此时用Canvas相关插件 将DOM元素转化为PDF&#xff0c;就会出现跨域错误。 二、解决办法 两步 1. 图片元素上设置属性 crossorigin"anonymous" 支持原生img和eleme组件 2. 存储桶设置资源跨域访问…

Redis多级缓存

文章目录 多级缓存背景JVM进程缓存Caffeine案例分析安装MySQL导入SQL Lua语法变量与循环数据类型声明变量循环 函数与条件控制函数条件控制 实现多级缓存安装OpenResty安装opm工具目录结构配置Nginx的环境变量运行启动 快速入门反向代理流程OpenResty监听请求编写item.lua 请求…

2023河南萌新联赛第(三)场:郑州大学 F

把题中所给的式子进行展开&#xff0c;最终可以得到一个等比数列。运用等比数列求和公式即可。 相关知识点&#xff1a;欧拉降幂&#xff0c;逆元。 逆元的用处&#xff1a;因为求和公式需要去除分子&#xff0c;而大数除法去取模会丢失精度&#xff0c;所以可以采用求出分子…

【设计模式——学习笔记】23种设计模式——桥接模式Bridge(原理讲解+应用场景介绍+案例介绍+Java代码实现)

问题引入 现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网&#xff0c;打电话等)&#xff0c;如图 【对应类图】 【分析】 扩展性问题(类爆炸)&#xff0c;如果我们再增加手机的样式(旋转式)&#xff0c;就需要增加各个品牌手机的类&#xff0c;同样如果我们…

C++第三方开发库matplotlib-cpp

Matplotlib-cpp是一个用于在C中绘制图表的开源库。它提供了与Python的Matplotlib库类似的功能&#xff0c;使得在C环境下进行数据可视化变得更加便捷。基于Matplotlib-cpp&#xff0c;我们可以使用各种绘图函数和样式选项来创建各种类型的图表&#xff0c;包括折线图、散点图、…