Java零基础后端知识(三)

简介: Java零基础后端知识

ScheduledThreadPoolExecutor:可调度的线程池

public class ScheduledThreadPoolDemo {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);//线程池允许执行的线程数
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("延迟1秒执行,每3秒执行一次");
            }
        },1,3, TimeUnit.SECONDS);
        scheduledExecutorService.shutdown();
    }
}
public class ScheduledThreadPoolDemo {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);//线程池允许执行的线程数
        scheduledExecutorService.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("延迟5秒执行");
            }
        },3, TimeUnit.SECONDS);
        scheduledExecutorService.shutdown();
    }
}

线程池的生命周期:


RUNNING :能接受新的任务,并且也能处理阻塞队列中的任务。

SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中的已保存的任务。

STOP:不能接受新任务,也不处理队列中的任务,会中断正在处理任务的线程。

TIDYING:如果所有的任务都已终止了,workCount(有效线程数)为0,线程池进入该状态后会调用terminated()方法进入TREMINATED状态。

TERMINATED:在terminated()方法执行完后进入该状态,默认terminated()方法中什么也没有做。


线程池参数:


corePoolSize:核心线程池的大小

maximumPoolSize:线程池能创建线程的最大个数

keepAliveTime:空闲线程存活时间

unit:时间单位,为keepAliveTime指定时间单位

workQueue:阻塞队列,用于保存任务的阻塞队列

threadFactory:创建线程的工厂类

handler:饱和策略(拒绝策略)


execute方法执行逻辑:


如果当前运行的线程少于corePoolSize,则会创建新的线程执行新的任务

如果运行的线程个数等于或者大于corePoolSize,则会将提交的任务存放到阻塞队列workQueue中;

如果当前workQueue队列已满的话,则会创建新的线程来执行任务;

如果线程个数已经超过了maximumPoolSize,则会使用饱和策略RejectedExecutionHandler来进行处理。


线程池的关闭:


关闭线程池,可以通过shutdown和shutdownNow两个方法

原理:遍历线程池中的所有线程,然后依次中断

shutdownNow首先将线程池的状态设置为STOP,然后尝试停止所有的正在执行和未执行任务的线程,并返回等待执行任务的列表。

shutdown只是将线程池的状态设置为SHUTDOWN状态,然后中断所有没有正在执行的线程。


网络编程:


两台主机之间通讯要先建立连接,建立连接要通过三次握手来建立,之后就会传输数据,最后要四次挥手断开连接。


public class InetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress localHost = InetAddress.getLocalHost();//获得本机主机IP地址
        System.out.println(localHost);
        InetAddress byName = InetAddress.getByName("www.baidu.com");
        InetAddress byName2 = InetAddress.getByName("WIN-AVA5NQL1LU5");
        System.out.println(byName);
    }
}

客户端:

public class Client {
    public static void main(String[] args) throws IOException {
        //创建socket对象,其实是开启实现io的虚拟接口
        Socket client=new Socket("localhost",10086);//需要指定数据接收方的ip地址和端口号
        //获取输出流对象,向服务端发送数据
        OutputStream outputStream = client.getOutputStream();
        //向输出流对象进行包装
        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
        //传输数据
        dataOutputStream.writeUTF("hello,你好,我是客户端");
        //关闭流操作
        dataOutputStream.close();
        outputStream.close();
        client.close();
    }
}

服务端:

public class Server {
    public static void main(String[] args) throws IOException {
        //服务端需要使用serversocket来开放本地的端口
        ServerSocket serverSocket=new ServerSocket(10086);
       //需要接受client传输过来的数据,需要定义socket对象
        Socket server=serverSocket.accept();
        //通过server获取输入流对象
        InputStream inputStream = server.getInputStream();
        //对输入流进行包装
        DataInputStream dataInputStream = new DataInputStream(inputStream);
        //读取对应的数据
        String str=dataInputStream.readUTF();
        System.out.println(str);
        //关闭所有的流操作
        dataInputStream.close();
        inputStream.close();
        server.close();
        serverSocket.close();
    }
}

JDK8新特性(Lambda表达式)


Lambda表达式介绍:


Lambda表达式是Java8中最重要的新功能之一。使用Lambda表达式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看起来更简洁易懂。Lambda表达式同时还提升了对集合、框架的迭代、遍历、过滤数据的操作。

public class LambdaDemo {
    public static void main(String[] args) {
        Thread thread1=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("thread1 running...");
            }
        });
        thread1.start();
       Thread thread2=new Thread(()-> System.out.println("thread2  running.."));
       thread2.start();
       List<String> lists= Arrays.asList("java","javascript","scala","python");
        Collections.sort(lists, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length()-o2.length();
            }
        });
        for(String str:lists){
            System.out.println(str);
        }
        Collections.sort(lists,(a,b)->(a.length()-b.length()));
        lists.forEach(System.out::println);
    }
}

函数式接口:

public class LambdaDemo2 {
    public static void main(String[] args) {
        /**
         *在Java中提供了一系列的函数式接口,用来接受后续传入的逻辑,但是对输入和输出有要求
         */
        Function<String,Integer> f1=(str)->{return str.length();};//第一个参数是输入的参数,第二个是返回的数据
        System.out.println(f1.apply("abcdefg"));
        Supplier<String> s1=()->{return "mashibing";};
        Supplier<String> s2=()->"mashibing2";
        System.out.println(s1.get());
        System.out.println(s2.get());
    }
}

特点:

函数式编程

参数类型自动推断

代码量少、简洁

方法的引用:


image.png


静态方法引用:如果函数式接口的实现恰好可以通过调用一个静态方法来实现,那么就可以使用静态方法引用


public class Test2 {
    static String put(){
        System.out.println("puting...");
        return "put";
    }
    public static void main(String[] args) {
        //静态方法引用
       Supplier<String> s=Test2::put;
        System.out.println(s.get());
    }
}


实例方法引用:如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现,那么就可以使用实例方法引用


public class Test3 {
    public String put(){
        return "put...";
    }
    public static void main(String[] args) {
        Supplier<String> s=new Test3()::put ;
        System.out.println(s.get());
    }
}
  • 对象方法引用:抽象方法的第一个参数类型刚好就是实例方法的类型,抽象方法剩余的参数可以恰好当做实例方法的参数。如果函数式接口的实现能由上面说的实例方法调用来实现的话,那么就可以使用对象方法引用
public class Test4 {
    public static void main(String[] args) {
        Consumer<Too> t1=Too::foo;
        t1.accept(new Too());
        Consumer<Too2> t2=Too2::foo;
        t2.accept(new Too2());
    }
}
class Too{
    public Integer fun(String s){
        return 1;
    }
    public void foo(){
        System.out.println("foo");
    }
}
class Too2{
    public Integer fun(String s){
        return 1;
    }
    public void foo(){
        System.out.println("foo....");
    }
    public void show(){
        System.out.println("too...s");
    }
}

构造方法引用:如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法引用。

public class Test5 {
    public static void main(String[] args) {
       Supplier<Person> s2=Person::new;
       s2.get();
       Supplier<List> s1= ArrayList::new;
       Function<String,Account> f1=(str)->new Account(str);
       Function<String,Account> f2=Account::new;
       f1.apply("abc");
       f2.apply("def");
        Consumer<Integer> c1=Account::new;
        c1.accept(3);
    }
}
class Account{
    public Account(){
        System.out.println("调用无参构造方法");
    }
    public  Account(int age){
        System.out.println("age 参数方法调用");
    }
    public Account(String str){
        System.out.println("str 参数方法调用");
    }
}
class Person{
    public Person(){
        System.out.println("无参构造方法调用");
    }
}
相关文章
|
17天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
48 3
|
18天前
|
小程序 前端开发 算法
|
1月前
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
133 1
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
1月前
|
NoSQL 安全 Java
Java后端基础自测
Java后端基础自测
60 12
|
1月前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
【10月更文挑战第8天】本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
35 5
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
19 1
|
1月前
|
算法 Java Linux
java制作海报五:java 后端整合 echarts 画出 折线图,项目放在linux上,echarts图上不显示中文,显示方框口口口
这篇文章介绍了如何在Java后端整合ECharts库来绘制折线图,并讨论了在Linux环境下ECharts图表中文显示问题。
39 1
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
105 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
460 1
|
1月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
28 0